query / insert probleem
Ik gebruik de volgende code om een url te doorzoeken. dit werkt allemaal prima :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?
/* 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);
?>
/* 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 :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?
/* 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);
?>
/* 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 ?
Gewijzigd op 01/01/1970 01:00:00 door Robin
Quote:
Wát wil er dan niet lukken?maar dat wil me niet echt 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.
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
Quote:
En daarom is een slechte controle acceptabel? Een goede controle maakt je script eenvoudiger en je voorkomt problemen. Wat wil je nog meer?de kans dat iemand op hetzelfde tijdsti een waarde toevoegd is uitgesloten aangezien ik de enige ben die iets toe kan voegen.
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 !!
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.
ik ben er nu achter waar de problemen zich precies bevinden.het zijn er namelijk 2 :
probleem 1 :
Code (php)
1
2
3
4
2
3
4
<?
preg_match_all("/(\b[\w+]+\b)/",$url,$words);
preg_match_all("/(\b[\w+]+\b)/",$naam,$words);
?>
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 :
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)
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?
mysql_query("INSERT INTO naam (naam_oms),page (page_url) VALUES (\"$naam\",\"$url\")");
$naam_id = mysql_insert_id();
$page_id = mysql_insert_id();
?>
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?
$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);
?>
$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);
?>
Gewijzigd op 01/01/1970 01:00:00 door Robin
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?
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
Quote:
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.ik heb er nu even geen foutcontrole in staan omdat ik een zo kaal mogelijk code wilde hebben om te testen
het preg_match_all gedeelte heb ik nu als volgt opgelost en het werkt nu prima:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?
preg_match_all("/(\b[\w+]+\b)/",$url,$words1);
preg_match_all("/(\b[\w+]+\b)/",$naam,$words2);
$words = array_merge($words1, $words2);
?>
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.
Voorbeeldje:
En nu vraag jij jezelf af waarom je een leeg scherm te zien krijgt. Dat kan meerdere oorzaken hebben: Je echoot niets of $i voldoet niet aan de voorwaarde. Met een foutafhandeling had je een else opgenomen en daar iets in een logboek gezet of met een echo op het scherm. Dat geeft duidelijkheid. error_reporting(E_ALL) had natuurlijk ook niet mogen ontbreken in dit voorbeeldje!
naar mijn inziens is het zo vrij netjes geprogrammeerd, maar graag hoor ik ook jouw mening hierover.
ik heb overigens bewust nog geen gebruik gemaakt van "transaction" aangezien ik me daar eerst even wat verder in wil verdiepen
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?
/* velden die doorzocht moeten worden: */
$naam = 'robin test';
$url = 'http://bonnie.islive.nl/?p=629';
/* bestaat de url reeds ?? */
$result = mysql_query("SELECT page_url FROM page WHERE page_url = \"$url\"");
$row = mysql_fetch_array($result) or die("Fout in query");
if( $row['page_url'] )
{
/* zo ja, gebruik dan de oude: */
$page_id = $row['page_id'];
}
else
{
/* zo nee, maak een nieuwe: */
mysql_query("INSERT INTO naam (naam_oms) VALUES (\"$naam\")")or die("Fout in query");
$naam_id = mysql_insert_id();
mysql_query("INSERT INTO page (page_url) VALUES (\"$url\")")or die("Fout in query");
$page_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,$words1);
preg_match_all("/(\b[\w+]+\b)/",$naam,$words2);
$words = array_merge($words1, $words2);
?>
/* velden die doorzocht moeten worden: */
$naam = 'robin test';
$url = 'http://bonnie.islive.nl/?p=629';
/* bestaat de url reeds ?? */
$result = mysql_query("SELECT page_url FROM page WHERE page_url = \"$url\"");
$row = mysql_fetch_array($result) or die("Fout in query");
if( $row['page_url'] )
{
/* zo ja, gebruik dan de oude: */
$page_id = $row['page_id'];
}
else
{
/* zo nee, maak een nieuwe: */
mysql_query("INSERT INTO naam (naam_oms) VALUES (\"$naam\")")or die("Fout in query");
$naam_id = mysql_insert_id();
mysql_query("INSERT INTO page (page_url) VALUES (\"$url\")")or die("Fout in query");
$page_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,$words1);
preg_match_all("/(\b[\w+]+\b)/",$naam,$words2);
$words = array_merge($words1, $words2);
?>
Gewijzigd op 01/01/1970 01:00:00 door Robin
Hier een voorbeeldje hoe je een query uitvoert en controleert:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
ini_set('display_errors',1);
error_reporting(E_ALL); // mag nooit ontbreken!
// rest van je code en dan:
$query = "INSERT INTO naam (naam_oms) VALUES ('".$naam."')";
$result = mysql_query($query); //or die("Fout in query"); 'Fout in query', daar kun je toch niets mee of wel dan?
if (!$result && mysql_errno() == 1062) { // dubbele waarde
echo 'Naam bestond al, gegevens zijn niet toegevoegd';
}
elseif (!$result){
echo 'Query mislukt vanwege de volgende fout: '.mysql_error();
echo 'In query: '.$query;
}
else {
echo 'Naam succesvol toegevoegd.';
}
?>
ini_set('display_errors',1);
error_reporting(E_ALL); // mag nooit ontbreken!
// rest van je code en dan:
$query = "INSERT INTO naam (naam_oms) VALUES ('".$naam."')";
$result = mysql_query($query); //or die("Fout in query"); 'Fout in query', daar kun je toch niets mee of wel dan?
if (!$result && mysql_errno() == 1062) { // dubbele waarde
echo 'Naam bestond al, gegevens zijn niet toegevoegd';
}
elseif (!$result){
echo 'Query mislukt vanwege de volgende fout: '.mysql_error();
echo 'In query: '.$query;
}
else {
echo 'Naam succesvol toegevoegd.';
}
?>
nogmaals bedankt.
ik loop nu weer tegen wat problemen aan tijdens het uitbreiden van het script,maar hier kom ik morgen op terug want word er nu even helemaal gek van ha ha
ik heb nog 1 probleem. Ik krijg de volgende foutmelding :
Notice: Undefined offset: 10 in /var/www/vhosts/blablabla/toevoegentest.php on line 109
dit is de betreffende regel:
het probleem ligt hem waarschijnlijk in de variable $words, die bestaat namelijk uit het volgende :
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
/* haal alle woorden eruit: */
preg_match_all("/(\b[\w+]+\b)/",$categorie,$words1);
preg_match_all("/(\b[\w+]+\b)/",$leeftijd,$words2);
preg_match_all("/(\b[\w+]+\b)/",$naam,$words3);
preg_match_all("/(\b[\w+]+\b)/",$naamsite,$words4);
preg_match_all("/(\b[\w+]+\b)/",$omschrijving,$words5);
preg_match_all("/(\b[\w+]+\b)/",$url,$words6);
preg_match_all("/(\b[\w+]+\b)/",$website,$words7);
preg_match_all("/(\b[\w+]+\b)/",$woonplaats,$words8);
$words = array_merge($words1, $words2, $words3, $words4, $words5, $words6, $words7, $words8);
?>
/* haal alle woorden eruit: */
preg_match_all("/(\b[\w+]+\b)/",$categorie,$words1);
preg_match_all("/(\b[\w+]+\b)/",$leeftijd,$words2);
preg_match_all("/(\b[\w+]+\b)/",$naam,$words3);
preg_match_all("/(\b[\w+]+\b)/",$naamsite,$words4);
preg_match_all("/(\b[\w+]+\b)/",$omschrijving,$words5);
preg_match_all("/(\b[\w+]+\b)/",$url,$words6);
preg_match_all("/(\b[\w+]+\b)/",$website,$words7);
preg_match_all("/(\b[\w+]+\b)/",$woonplaats,$words8);
$words = array_merge($words1, $words2, $words3, $words4, $words5, $words6, $words7, $words8);
?>
maar naar mijn inziens is er niets mis met bovenstaande code of zie ik dit verkeerd ?
Gewijzigd op 01/01/1970 01:00:00 door Robin
Het tweede deel van een for loop hoort een conditie te bevatten en bij jou staat er alleen een variabele. Zodra $j 10 wordt, gaat het fout.
ik heb hier al gekeken : http://nl2.php.net/manual/nl/control-structures.for.php en wat op google gezocht maar daar werd ik niet veel wijzer van.
Bedoel je dan dat het zoiets moet worden ?
het gedeelte bestaat overigens uit 2 regels, dus ik neem aan dat de andere regel dan ook aangepast dient te worden ?
Gewijzigd op 01/01/1970 01:00:00 door Robin
Quote:
In dit voorbeeldje moet $i kleiner of gelijk zijn aan 10 (TRUE) om $i op het scherm te zetten. Zodra $i groter is dan 10 (FALSE), zal de for-lus er mee stoppen.Aan het begin van elke iteratie wordt expr2 geevalueerd. Als deze evalueert tot TRUE, dan gaat de loop verder en worden de geneste statements uitgevoerd. De execute van de loop stopt als de expressie evalueert tot FALSE.
for ($i = 1; $i <= 10; $i++) {
print $i;
}
for ($i = 1; $i <= 10; $i++) {
print $i;
}
Jij zult dus overal jouw for-lussen van de juiste syntax moeten voorzien.
Die vergelijking zorgt er dus voor dat de for lus stopt indien de 50 bereikt word. In onderstaand voorbeeld worden dus maximaal 50 woorden geindexeerd en daarna stopt de lus.
Code (php)
ik ben nu even op mijn werk maar zal het staks even uitproberen en kijken of de error hier inderdaad mee verdwijnt.
$words[$i] is wel heel wat anders dan $i.