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();
}
/* 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.
/* 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();
}
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.
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.
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 :
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();
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: