Hallo,

Ik gebruik de volgende code om een url te doorzoeken. dit werkt allemaal prima :

<?

/* velden die doorzocht moeten worden: */
$url = 'http://test.nl';

/* bestaat de url reeds ? */
$result = mysql_query("SELECT page_id FROM page WHERE page_url = \"$url\"");
$row = mysql_fetch_array($result);

if( $row['page_id'] )
{
/* zo ja, gebruik dan de oude: */
$page_id = $row['page_id'];
}
else
{
/* zo nee, maak een nieuwe: */
mysql_query("INSERT INTO page (page_url) VALUES (\"$url\")");
$page_id = mysql_insert_id();
}

/* verwijder alle HTML-tags: */
$url = strip_tags($url);
$url = ereg_replace('/&\w;/', '', $url);

/* haal alle woorden eruit: */
preg_match_all("/(\b[\w+]+\b)/",$url,$words);

?>

hierna volgt overigens nog een stuk extra code, maar anders werd het erg onoverzichtelijk om hier te plaatsen.

Hij haalt met deze code alle woorden op uit een url. Echter moet hij naast de url ook worden uit een naam (en later ook uit een omschrijving) halen, dit moet dus toegevoegd worden aan bovenstaande code, maar dat wil me niet echt lukken.

ik heb er zoiets van gemaakt :

<?

/* velden die doorzocht moeten worden: */
$url = 'http://bonnie.islive.nl/?p=629';
$naam = 'anita';

/* bestaat de url reeds ?? */
$result = mysql_query("SELECT page_id,naam_id FROM page,naam WHERE page_url = \"$url\",naam_oms = \"$naam\"");
$row = mysql_fetch_array($result);

if( $row['page_id'],$row['naam_id'] )
{
/* zo ja, gebruik dan de oude: */
$page_id = $row['page_id'];
$naam_id = $row['naam_id'];
}
else
{
/* zo nee, maak een nieuwe: */
mysql_query("INSERT INTO page (page_url),naam (naam_oms) VALUES (\"$url\",\"$naam\")");
$page_id = mysql_insert_id();
$naam_id = mysql_insert_id();
}

/* verwijder alle HTML-tags: */
$url = strip_tags($url);
$url = ereg_replace('/&\w;/', '', $url);

$naam = strip_tags($naam);
$naam = ereg_replace('/&\w;/', '', $naam);

/* haal alle woorden eruit: */
preg_match_all("/(\b[\w+]+\b)/",$url,$words);
preg_match_all("/(\b[\w+]+\b)/",$naam,$words);

?>

ik heb al zoveel geprobeerd, maar snap er nu echt niets meer van. Iemand een suggestie om mij verder te helpen ?
maar dat wil me niet echt lukken.
Wát wil er dan niet lukken?

Begin in elk geval eens met het controleren of de queries wel zijn gelukt, dus of $result wel TRUE is. Zo niet, vraag dan met mysql_error() de fout op en echo de eens.

Wanneer je de kolommen page_id en naam_id UNIQUE maakt, dan kun je nooit en te nimmer een dubbele waarde in de tabellen zetten. De SELECT-query is dan ook nergens voor nodig, deze is trouwens toch niet betrouwbaar, de gegevens zijn achterhaald op het moment dat de query klaar is. Dat jij daarna nog met PHP een controle doet, heeft eigenlijk al geen zin meer, je weet niet of iemand anders op dat moment een INSERT van dezelfde gegevens doet.
Frank,

Ja je hebt helemaal gelijk, ik kan dan beter controleren of de url er al in staat ipv de id-waarde.

de kans dat iemand op hetzelfde tijdsti een waarde toevoegd is uitgesloten aangezien ik de enige ben die iets toe kan voegen.

Hj laat nu overigens een lege pagina zien en geeft geen error...ik zal kijken of ik hier iets mee kan doen...

ik laat asap iets weten..bedankt alvast voor de reactie
de kans dat iemand op hetzelfde tijdsti een waarde toevoegd is uitgesloten aangezien ik de enige ben die iets toe kan voegen.
En daarom is een slechte controle acceptabel? Een goede controle maakt je script eenvoudiger en je voorkomt problemen. Wat wil je nog meer?
ja ok klopt, maar het is in mijn ogen een goede manier om te checken of iets al in de database staat.

jij geeft aan dat deze controle onbetrouwbaar is, maar hoe kan ik dit beter aanpakken dan ?

want als ik het helemaal weg laat is er helemaal geen controle meer !!
Gewoon de kolommen waar het om gaat UNIQUE maken (eigenschap van de kolom, zie ook PHPMyAdmin en de MySQL-handleiding) en klaar ben je.

De INSERT-query zal nu mislukken wanneer de waarde al in de kolom staat. Met mysql_errno() kun je het foutnummer opvragen en wanneer dit gelijk is aan nummer 1062 (zie MySQL-handleiding) dan heb je een poging gedaan om een dubbele waarde in de tabel weg te schrijven. De database heeft dit echter voorkomen, precies zoals het hoort.

Zoals je ziet, heb je helemaal geen SELECT-query nodig om dit vast te stellen. Gewoon INSERT-en en de eventuele foutmelding opvangen. Dat laatste moet je toch al doen, dat is niets nieuws onder de zon.
ah ok bedankt voor de uitleg...stel dat erg op prijs.

ik ben er nu achter waar de problemen zich precies bevinden.het zijn er namelijk 2 :

probleem 1 :

<?
preg_match_all("/(\b[\w+]+\b)/",$url,$words);
preg_match_all("/(\b[\w+]+\b)/",$naam,$words);
?>

hij pakt alleen de laatste regel, dus van naam. Nu kan ik dit waarschijnlijk wel opvangen door het volgende te doen : $words1 (voor url) en $words2 (voor naam) en dan words= words1 + words 2 of iets dergelijks...

echter moet dit makkelijker kunnen, maar het volgende pakt hij niet :

<?
preg_match_all("/(\b[\w+]+\b)/",$url,$naam,$words);
?>

met haakjes erbij ($url,$naam) werkte ook niet....

is er een makkelijke manier om dit te doen of kan ik het beste zoiets proberen als ik aangaf ?


probleem 2 :

hij pakt de onderstaande code op de een of andere manier niet (volgorde klopt overigens dus naam eerst en dan page)

<?
mysql_query("INSERT INTO naam (naam_oms),page (page_url) VALUES (\"$naam\",\"$url\")");
$naam_id = mysql_insert_id();
$page_id = mysql_insert_id();

?>

ik heb er nu tijdelijk de onderstaande code voor gebruikt, die wel werkt, echter is hij erg omslachtig en moet het beter kunnen, maar het lukt me maar niet om het in 1 query te proppen:

<?

$insert = "INSERT INTO naam (naam_oms)VALUES (\"$naam\")";
$naam_id = mysql_insert_id();

$uitvoeren = mysql_query($insert);

$insert = "INSERT INTO page (page_url)VALUES (\"$url\")";
$page_id = mysql_insert_id();

$uitvoeren = mysql_query($insert);

?>
De 2e oplossing lijkt mij beter, maar nog beter is het om een TRANSACTION te gebruiken. Je hebt namelijk 2 INSERT-queries die van elkaar afhankelijk zijn. Wanneer de ene mislukt, dan MOET de andere query niet worden uitgevoerd of worden geannuleerd. Zonder TRANSACTION is dat onmogelijk. Om gebruik te maken van TRANSACTION's ben je wel verplicht om de innoDB-engine van MySQL te gebruiken, maar dat is toch al de betere engine.

Dan nog even over jouw code, waar controleer jij of de queries zijn gelukt en of er soms id gepoogd om een dubbele waarde in de database weg te schrijven?
ok ik ga er meteen even het eea over opzoeken en uitproberen, nogmaals bedankt.

ik heb er nu even geen foutcontrole in staan omdat ik een zo kaal mogelijk code wilde hebben om te testen of die in ieder geval correct was...foutcontroles zal ik er zo weer aan toevoegen.


maar kan ik dat van het preg_match_all gedeelte ook in 1 regel maken of is dat niet mogelijk ?

ik ga in ieder geval het eea proberen en laat de nieuwe code asap zien
ik heb er nu even geen foutcontrole in staan omdat ik een zo kaal mogelijk code wilde hebben om te testen
Hoe kun je nu testen zonder foutafhandeling? Dan heb je geen idee of dingen nu goed of fout gaan! Dit mag echt nooit ontbreken, het is de basis van jouw systeem.
ja klinkt raar en je hebt ook helemaal gelijk, maar voor mij persoonlijk maakt het alles een stuk overzichtelijker...en ik probeer elk stukje code gewoon opzich op correctheid alvorens ik alles in 1 geheel verwerk.

het preg_match_all gedeelte heb ik nu als volgt opgelost en het werkt nu prima:

<?
preg_match_all("/(\b[\w+]+\b)/",$url,$words1);
preg_match_all("/(\b[\w+]+\b)/",$naam,$words2);

$words = array_merge($words1, $words2);
?>

dat transaction gedeelte ben ik nog aan het proberen en kom daar zsm op terug.

Reageren