query / insert probleem

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Robin

Robin

14/11/2006 14:34:00
Quote Anchor link
Hallo,

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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?

/* 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)
PHP script in nieuw venster Selecteer het PHP script
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
<?

/* 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
 
PHP hulp

PHP hulp

18/11/2024 22:52:27
 
Frank -

Frank -

14/11/2006 14:47:00
Quote Anchor link
Quote:
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.
 
Robin

Robin

14/11/2006 15:00:00
Quote Anchor link
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
 
Frank -

Frank -

14/11/2006 15:14:00
Quote Anchor link
Quote:
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?
 
Robin

Robin

14/11/2006 15:23:00
Quote Anchor link
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 !!
 
Frank -

Frank -

14/11/2006 15:48:00
Quote Anchor link
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.
 
Robin

Robin

14/11/2006 16:24:00
Quote Anchor link
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 :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?
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 :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
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)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();

?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
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);

?>
Gewijzigd op 01/01/1970 01:00:00 door Robin
 
Frank -

Frank -

14/11/2006 16:43:00
Quote Anchor link
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?
 
Robin

Robin

14/11/2006 16:54:00
Quote Anchor link
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
 
Frank -

Frank -

14/11/2006 17:04:00
Quote Anchor link
Quote:
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.
 
Robin

Robin

14/11/2006 17:41:00
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>


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

Frank -

14/11/2006 17:51:00
Quote Anchor link
Tja, dan hoop ik dat je z.s.m. toch een andere (lees: betere) werkmethode gaat hanteren. Met jouw huidige methode kost het je veel meer tijd en moeite om iets goeds te bouwen dan wanneer je de foutafhandeling als kern van jouw systeem neemt. Om eerlijk te zijn, zonder foutafhandeling valt er niets te testen omdat je nog helemaal geen systeem hebt dat kan worden getest. Dingen gaan goed of fout, dingen gaan niet goed of ..... , dat bestaat gewoon niet. Daarom mag de foutafhandeling nooit en te nimmer ontbreken, daar begin je mee.

Voorbeeldje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?
if($i == 1){
  $string = 23;
}

?>

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!
 
Robin

Robin

14/11/2006 19:38:00
Quote Anchor link
ik begrijp je punt. Ik ben er inmiddels uitgekomen en dit is het resultaat geworden :

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?
/* 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
 
Frank -

Frank -

14/11/2006 20:06:00
Quote Anchor link
Waarom houd je toch vast aan die SELECT-query terwijl je weet dat je daar niets aan hebt? Maak de boel UNIQUE in de database, dat is de enige juiste oplossing!

Hier een voorbeeldje hoe je een query uitvoert en controleert:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.';
}

?>
 
Robin

Robin

14/11/2006 20:48:00
Quote Anchor link
ah bedoelde je het op die manier,ik had de waardes al wel op uniek gezet, maar had geen idee dat het ook zo kon....domme onwetendheid dus..

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
 
Robin

Robin

14/11/2006 22:37:00
Quote Anchor link
nou na circa 8 uur piekeren en proberen en uiteraard met veel hulp van jou/jullie ben ik er bijna uit. die tip met de error reporting is inderdaad echt super handig...super gewoon

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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

for( $j = 0; $words[$i][$j]; $j++ )

?>


het probleem ligt hem waarschijnlijk in de variable $words, die bestaat namelijk uit het volgende :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);

?>


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
 
Jan Koehoorn

Jan Koehoorn

14/11/2006 22:47:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    for( $j = 0; $words[$i][$j]; $j++ )
?>


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.
 
Robin

Robin

15/11/2006 00:12:00
Quote Anchor link
bedankt voor je reactie, echter begrijp ik het niet helemaal. Hoe weet je namelijk dat het fout gaat zodra $j 10 word ? die logica ontbreekt me eerlijk gezegd.

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 ?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    for( $j = 0; $words[$i][$j] <= 100; $j++ )
?>



het gedeelte bestaat overigens uit 2 regels, dus ik neem aan dat de andere regel dan ook aangepast dient te worden ?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php

   for( $i = 0; $words[$i]; $i++ )
   {

      for( $j = 0; $words[$i][$j]; $j++ )
      {


?>
Gewijzigd op 01/01/1970 01:00:00 door Robin
 
Frank -

Frank -

15/11/2006 11:25:00
Quote Anchor link
Klopt, jij hebt in $words[$i]; en $words[$i][$j]; geen vergelijking staan en dat is wel de bedoeling:
Quote:
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;
}
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.

Jij zult dus overal jouw for-lussen van de juiste syntax moeten voorzien.
 
Robin

Robin

15/11/2006 14:04:00
Quote Anchor link
super dat is helemaal duidelijk. Dus stel ik voeg een vergelijking toe met als resultaat onderstaande code.

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php

   for( $i = 0; $words[$i] <= 50; $i++ )
   {

      for( $j = 0; $words[$i][$j] <= 50; $j++ )
      {


?>


ik ben nu even op mijn werk maar zal het staks even uitproberen en kijken of de error hier inderdaad mee verdwijnt.
 
- SanThe -

- SanThe -

15/11/2006 14:27:00
Quote Anchor link
$words[$i] is wel heel wat anders dan $i.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.