Query wordt niet uitgevoerd
Quote:
$sql = "UPDATE users SET teller= teller-1 WHERE ID= $inlog";
Dit werkt perfect, maar ik wil ook nog een record bijschrijven in een andere tabel en dit doe ik met
Quote:
$sql = "INSERT INTO test (User, code, via ) values ('$naam', '$res', '$via' )";
Dus deze 2 lijnen staan in de code achter elkaar , en dan werkt er geen enkel.
Als ik de 2 de lijn in commentaar plaats dan werkt de eerste lijn wel, en omgekeerd ook.
Kan er mij iemand zeggen wat er hier verkeerd is AUB.
Ps : ben een beginner hoor ....
Gewijzigd op 13/10/2020 16:14:28 door - Ariën -
(mysqli_)query(...) aanroep als je met mysql(i) werkt.
Indien er dingen misgaan met je query is het natuurlijk ook handig dat je nagaat wat er precies misgaat. Dit kun je bijvoorbeeld doen met mysqli_error(). Deze functie/methode retourneert een niet-lege string op het moment dat de laatst uitgevoerde query een fout opleverde.
Omdat er uit het bovenstaande bericht nogal wat relevante code ontbreekt en omdat we verder geen informatie hebben over de users en test tabellen wordt het nogal lastig om op te maken wat er nu precies misgaat. Ook $inlog, $naam, $res en $via zouden waarden kunnen bevatten die de werking van de query verstoren, en kunnen mogelijk misbruikt worden voor het inbreken in de database indien deze variabelen niet voldoende zijn gecontroleerd (validatie) of bewerkt (escaping).
Waar voer je de query daadwerkelijk uit op de database? De bovenstaande twee $sql-variabelen zijn enkel de tekst-strings met hierin SQL-queries, maar deze zul je op een of andere manier moeten voeren aan je database met bijvoorbeeld een Indien er dingen misgaan met je query is het natuurlijk ook handig dat je nagaat wat er precies misgaat. Dit kun je bijvoorbeeld doen met mysqli_error(). Deze functie/methode retourneert een niet-lege string op het moment dat de laatst uitgevoerde query een fout opleverde.
Omdat er uit het bovenstaande bericht nogal wat relevante code ontbreekt en omdat we verder geen informatie hebben over de users en test tabellen wordt het nogal lastig om op te maken wat er nu precies misgaat. Ook $inlog, $naam, $res en $via zouden waarden kunnen bevatten die de werking van de query verstoren, en kunnen mogelijk misbruikt worden voor het inbreken in de database indien deze variabelen niet voldoende zijn gecontroleerd (validatie) of bewerkt (escaping).
Gewijzigd op 13/10/2020 16:00:32 door Thomas van den Heuvel
Verder wil ik je vragen om in het vervolg een duidelijke topictitel mee te geven die je probleem of vraag omschrijft. Voor deze keer pas ik het zelf even aan. Alvast bedankt.
Probeer iets als:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$sql
= 'INSERT INTO `test` (`User`, `code`, `via`)'
. ' VALUES (' . $naam . ', ' . $res . ', ' . $via . ')';
?>
$sql
= 'INSERT INTO `test` (`User`, `code`, `via`)'
. ' VALUES (' . $naam . ', ' . $res . ', ' . $via . ')';
?>
Het geheim zit hem in het escapen met backticks (`) van kolomnamen. Dat moet om onderscheid te kunnen maken tussen de kolomnamen en de commando's USER en CODE. Bij de kolom via had dat eigenlijk niet gehoeven.
https://dev.mysql.com/doc/refman/8.0/en/keywords.html
En voor de veiligheid wil je een absoluut onderscheid tussen de SQL-code en wat er in de variabelen $naam, $res en $via staat. Dat kan alleen met prepared statements.
https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php
mysqli_real_escape_string, zolang je het goed gebruikt, en de functies niet met elkaar mengt. Maar je moet dan wel goed weten op welke variabelen je het toepast, en op welke manier.
Of met Gewijzigd op 13/10/2020 16:49:57 door - Ariën -
Ad Fundum op 13/10/2020 16:18:46:
En voor de veiligheid wil je een absoluut onderscheid tussen de SQL-code en wat er in de variabelen $naam, $res en $via staat. Dat kan alleen met prepared statements.
https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php
https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php
Deze stelling is onjuist, zoals ik al in een ander topic heb toegelicht (interne link). Het gebruik van real_escape_string() icm quotes werkt prima.
- Ariën - op 13/10/2020 16:45:44:
Maar je moet dan wel goed weten op welke variabelen je het toepast, en op welke manier.
Gewoon alle variabelen die je in een SQL-querystring invoegt, met gebruikmaking van quotes. Dan hoef je niet elke keer code te interpreteren en nagaan of iets bewust niet is geescaped of dat het toch per ongeluk is vergeten.
Gewijzigd op 13/10/2020 16:54:16 door Thomas van den Heuvel
Maar ik begrijp jullie niet zo goed .
Ik werk inderdaad met een Mysql database en die spreek ik aan :
Quote:
$host = "localhost";
$username = "root";
$password = "";
$database = "duikers";
$con=mysqli_connect($host, $username, $password,$database) or die (mysqli_error());
$username = "root";
$password = "";
$database = "duikers";
$con=mysqli_connect($host, $username, $password,$database) or die (mysqli_error());
Quote:
Ik wil in de database duikers 2 dingen doen, in tabel users record aanpassen, en een record bijschrijven in tabel test
Ik doe dit zo :
Ik doe dit zo :
Quote:
$sql = "UPDATE users SET teller= teller-1 WHERE ID= $inlog";
$sql = "INSERT INTO test (User, code, via ) values ('$naam', '$res', '$via' )";
$sql = "INSERT INTO test (User, code, via ) values ('$naam', '$res', '$via' )";
Quote:
Als ik het programma run wordt er niks uitgevoerd :
Als ik deze regel in commentaar plaats dan wordt het record aangepast.
Als ik het programma run wordt er niks uitgevoerd :
Als ik deze regel in commentaar plaats dan wordt het record aangepast.
Quote:
//$sql = "INSERT INTO test (User, code, via ) values ('$naam', '$res', '$via' )";
Quote:
En ook omgekeerd, als ik de andere regel in commentaar plaats wordt het record bijgeschreven.
Mag ik geen 2 maal $sql gebruiken achter elkaar ?
Mag ik geen 2 maal $sql gebruiken achter elkaar ?
Het zal zoiets moeten worden:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// maak verbinding
$con = mysqli_connect(/* vul hier $host, $user etc in */);
// definieer query #1
$sql = "...";
// voer query #1 uit op de database
mysqli_query($con, $sql);
// definieer query #2, waarbij je de eerste querystring overschrijft
$sql = "...";
// voer query #2 uit op de database
mysqli_query($con, $sql);
?>
// maak verbinding
$con = mysqli_connect(/* vul hier $host, $user etc in */);
// definieer query #1
$sql = "...";
// voer query #1 uit op de database
mysqli_query($con, $sql);
// definieer query #2, waarbij je de eerste querystring overschrijft
$sql = "...";
// voer query #2 uit op de database
mysqli_query($con, $sql);
?>
Als ik dit doe zoals jij het hier schrijft wordt enkel de eerste $sql uitgevoerd .
de 2de query wordt niet uitgevoerd.
Waaraan kan dit liggen ?
Wat zegt mysqli_error($con) na afloop van de tweede query?
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
Ik zou niet weten wat er verkeerd aan is
Toevoeging op 14/10/2020 10:25:17:
Thomas,
Quote:
$sql = "INSERT INTO test (User, code, via ) values ('$naam', '$res', '$via' )";
als ik een echo uitvoer op $naam en $res en $via, dan zijn ze allemaal gekend.
Heb ook al geprobeerd met de ' ' weg te laten , en is hetzelfde
deze sql wil hij niet uitvoeren.
Toevoeging op 14/10/2020 11:04:14:
Thomas,
Ik heb gevonden dat het bij de $naam is dat het verkeerd gaat, als ik er gewoon 'naam' zet dat schrijft hij naam weg in het record als ik er $naam van maak lukt het niet , terwijl er in $naam = Dirk staat .
Nu kan ik helemaal niet meer mee.
Wat doet een echo op $sql ?
Dit ziet er goed uit
INSERT INTO test (User, code, via ) values ('Dirk', '7V9AH', 'APP' )
het ligt bij de $naam, als ik gewoon 'naam' meegeef dan schrijft hij naam weg, terwijl er in $naam via echo Dirk staat.
begrijp het niet meer ..
Ik raad wel aan om dit te escapen. Want bij Jacques 'd Ancona zal de query vanwege de apostrof onderuit gaan.
Iedereen bedankt , maar ik heb het gevonden.
Het was het volgende :
Voor de uitvoering gewoon $naam = mysqli_real_escape_string($con, $naam);
iedereen bedankt
Zonder die functie zou Dirk moeten werken, Jacques 'd Ancona weer niet.
User en Code hebben namelijk voor Mysql ook een betekenis.
Nee met backtics