[PHP/MySQL] Meerdere rijen invoegen geeft een syntax error.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bij de onderstaande PHP code heb ik geen enkel probleem met het invoegen van 1 rij in de database (MySQL), maar zodra ik er meerdere achter elkaar wil invoegen krijg ik een syntax error. Er zit dus waarschijnlijk ergens een probleem bij het invoegen van meerdere rijen, dus niet bij het aanroepen van de database of iets dergelijks (waar ik zelf eerst dacht dat het probleem zat).

Ik heb de essentiële delen van de PHP Code overgenomen en wat test variabelen opgenomen (die anders wat nuttigere informatie bevat ;) ), hij geeft op deze manier de zelfde foutmelding (uiteraard heb ik mijn wachtwoord enz. met *** vervangen).

Het gaat om de volgende PHP 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
<?php
$url[0] = "test1";
$url[1] = "test2";
$url[2] = "test3";

$omsch[0] = "test4";
$omsch[1] = "test5";
$omsch[2] = "test6";

function data()
{
    
    global $url;
    global $omsch;
    
    $user = "***";
    $password = "*****";
    $host     = "freeserverhost.net";
    $dbnaam   = "*****";
    
    $db=mysql_connect($host, $user, $password) or die (mysql_error());
    mysql_select_db($dbnaam, $db) or die (mysql_error());

    for ($teller = 0;$url[$teller];$teller++)
    {
        $datum = "2004-10-10 11:55:55";
        $query .= "INSERT INTO test (url, omsch, datum) ";
        $query .= "VALUES ('";
        $query .= $url[$teller] . "', '";
        $query .= $omsch[$teller] . "', '";
        $query .= $datum . "');\n";
        $result = mysql_query($query) or die ("FOUT: " . mysql_error());
    }
}
data();
?>

En dat geeft dan de volgende foutmelding:
code:
1
2
3
FOUT: You have an error in your SQL syntax.  Check the manual that corresponds to
your MySQL server version for the right syntax to use near ';
INSERT INTO test (url, omsch, datum) VALUES ('test2', 'test5'


Om te kijken wat er nu precies naar de MySQL database wordt gestuurd heb ik het stukje dat de database aanspreekt aangepast.:
PHP:
1
2
3
4
5
6
7
8
9
10
11
    for ($teller = 0;$url[$teller];$teller++)
    {
        $datum = "2004-10-10 11:55:55";
        $query .= "INSERT INTO test (url, omsch, datum) ";
        $query .= "VALUES ('";
        $query .= $url[$teller] . "', '";
        $query .= $omsch[$teller] . "', '";
        $query .= $datum . "');";
        //$result = mysql_query($query) or die ("FOUT: " . mysql_error());
        echo ("$query");
    }


ik krijg dan de volgende uitvoer:
code:
1
2
3
4
5
6
7
INSERT INTO test (url, omsch, datum) VALUES ('test1', 'test4', '2004-10-10
11:55:55');INSERT INTO test (url, omsch, datum) VALUES ('test1', 'test4', '2004-10-10
11:55:55');INSERT INTO test (url, omsch, datum) VALUES ('test2', 'test5', '2004-10-10
11:55:55');INSERT INTO test (url, omsch, datum) VALUES ('test1', 'test4', '2004-10-10
11:55:55');INSERT INTO test (url, omsch, datum) VALUES ('test2', 'test5', '2004-10-10
11:55:55');INSERT INTO test (url, omsch, datum) VALUES ('test3', 'test6', '2004-10-10
11:55:55');

Ook als ik via \n het op een nieuwe regel laat beginnen dan krijg ik de zelfde foutmelding

Ik heb gezocht hier op het forum, met google en in de handleiding van MySQL en PHP en kan geen oplossing vinden. Het zal denk ik wel iets kleins zijn, maar ik zie het niet

het probleem kort samengevat
- Met het script kan ik 1 rij foutloos invoegen
- zodra ik meerder rijen wil invoeren krijg ik vanaf de tweede rij een foutmelding

Acties:
  • 0 Henk 'm!

Verwijderd

Welicht moet je even je $query variabele leeg maken voordat je hem weer opnieuw gebruikt?

[ Voor 1% gewijzigd door Verwijderd op 20-09-2004 17:13 . Reden: typo ]


Acties:
  • 0 Henk 'm!

Verwijderd

Doe eens ipv
PHP:
1
2
3
<?
        $query .= "INSERT INTO test (url, omsch, datum) "; 
?>


zo:

PHP:
1
2
3
<?
        $query = "INSERT INTO test (url, omsch, datum) "; 
?>


Je zet nu je 2de query achter je eerste enz..

*te laat dus...:)

[ Voor 92% gewijzigd door Verwijderd op 20-09-2004 17:14 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Via php mag je op deze manier niet meerdere queries versturen naar mysql. Je kunt echter wel telkens het values stukje herhalen.
vb:
code:
1
 INSERT INTO tabel (rij1,rij2) VALUES (val1_1,val1_2),(val2_1,val2_2);

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor jullie snelle reacties.

@ivy en @heidekneus
Dat is in iedergeval een foutje, maar als ik dat verbeter doet hij het nog steeds niet
Janoz schreef op 20 september 2004 @ 17:13:
Via php mag je op deze manier niet meerdere queries versturen naar mysql. Je kunt echter wel telkens het values stukje herhalen.
vb:
code:
1
 INSERT INTO tabel (rij1,rij2) VALUES (val1_1,val1_2),(val2_1,val2_2);
Dit zal ik even proberen, klinkt in ieder geval erg aannemelijk :*) . Zal wel even melden of het gelukt is (waarschijnlijk morgen).

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op 20 september 2004 @ 17:36:
Dit zal ik even proberen, klinkt in ieder geval erg aannemelijk :*) . Zal wel even melden of het gelukt is (waarschijnlijk morgen).
Denk er dan wel alsjeblieft even aan om de query dan pas uit te voeren als je hem hebt opgebouwd. :P

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb de PHP code aangepast op de manier die Janoz adviseerde, hier volgt het voor belangstellenden:
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
<?php
$url[0] = "test1";
$url[1] = "test2";
$url[2] = "test3";

$omsch[0] = "test4";
$omsch[1] = "test5";
$omsch[2] = "test6";

function data()
{
    global $url;
    global $omsch;
    
    $user = "***";
    $password = "***";
    $host     = "***";
    $dbnaam   = "***";
    $db=mysql_connect($host, $user, $password) or die (mysql_error());
    mysql_select_db($dbnaam, $db) or die (mysql_error());
    
    $query = "INSERT INTO test (url, omsch, datum) VALUES ";
    for ($teller = 0;$url[$teller+1];$teller++)
    {
        $datum = "2004-10-10 11:55:55";
        $query .= "('$url[$teller]','$omsch[$teller]','$datum'),";      
    }
    $query .= "('$url[$teller]','$omsch[$teller]','$datum');";
    $resul = mysql_query($query);
}
data();
?>

Dit gaat allemaal goed, maar ik heb nog een vraag, de colom 'url' heb ik in MySQL op een unieke waarde gezet, zodat er geen dubbele in komen. Nu gaat het goed als alleen de laatste(n) dubbel zijn, hij stopt dus met het invoegen zodra er 1 dubbel is en gaat dus niet verder met latere eventuele niet dubbele rijen.
Ik kan het script niet zo aanpassen, zodat het een nieuwe "INSERT" doet met de waarden na de dubbele (je kan kennelijk in het script maar 1 keer "INSERT" gebruiken). Moet ik nu van tevoren controleren of er dubbelen bij zitten, of is hier een makkelijkere oplossing voor?

[ Voor 22% gewijzigd door Verwijderd op 21-09-2004 19:04 ]


Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$url    = array('test1', 'test2', 'test3');
$omsch  = array('test4', 'test5', 'test6');
     
$user   = "***"; 
$password   = "***"; 
$host   = "***"; 
$dbnaam = "***"; 
    
$db = mysql_connect($host, $user, $password) or die (mysql_error()); 
mysql_select_db($dbnaam, $db) or die (mysql_error());

for($i=0; $i<count($url); $i++) {
    mysql_query("INSERT INTO test(url, omsch, datum) VALUES ('".$url[$i]."', '".$omsch[$i]."', '". $datum ."')") or die(mysql_error());
}


En dubbele waarden in je array(s) moet je van te voren maar even checken :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op 21 september 2004 @ 19:34:
En dubbele waarden in je array(s) moet je van te voren maar even checken :)
Even voor de duidelijkheid, ik bedoel niet de dubbele waarden die in de array zitten, maar waarden die in de array zitten en ook al in de database voorkomen.

/edit
Als ik de code die jij geeft gebruikt en het gedeelte
code:
1
or die(mysql_error()

weghaald dan is mijn probleem opgelost. (is misschien niet helemaal netjes, maar het werkt wel) :*)

[ Voor 24% gewijzigd door Verwijderd op 21-09-2004 20:37 ]

Pagina: 1