Query wordt niet uitgevoerd

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Berta Pappens

Berta Pappens

13/10/2020 15:41:40
Quote Anchor link
Ik open mijn database en wil een record aanpassen met
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 -
 
PHP hulp

PHP hulp

02/08/2021 21:51:16
 
Thomas van den Heuvel

Thomas van den Heuvel

13/10/2020 15:58:36
Quote Anchor link
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 (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).
Gewijzigd op 13/10/2020 16:00:32 door Thomas van den Heuvel
 
- Ariën -
Beheerder

- Ariën -

13/10/2020 16:14:15
Quote Anchor link
Het kan geen kwaad om $sql tijdens het testen eens door een echo te gooien. Dan weet je precies wat de query is die uitgevoerd wordt.

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.
 
Ad Fundum

Ad Fundum

13/10/2020 16:18:46
Quote Anchor link
Ik neem aan dat je MySQL gebruikt als database?

Probeer iets als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
  $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
Gewijzigd op 13/10/2020 16:20:58 door Ad Fundum
 
- Ariën -
Beheerder

- Ariën -

13/10/2020 16:45:44
Quote Anchor link
Of met 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.
Gewijzigd op 13/10/2020 16:49:57 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

13/10/2020 16:51:24
Quote Anchor link
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

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
 
Berta Pappens

Berta Pappens

13/10/2020 17:05:46
Quote Anchor link
Alvast bedankt allemaal.
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());
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 :
Quote:
$sql = "UPDATE users SET teller= teller-1 WHERE ID= $inlog";
$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.
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 ?
 
Thomas van den Heuvel

Thomas van den Heuvel

13/10/2020 17:17:14
Quote Anchor link
Je mag $sql zo vaak gebruiken als je wilt. Maar $sql = '...'; wijzigt op zichzelf niets in de database. Met die code ken je enkel de waarde "..." toe aan $sql, er worden daarmee geen queries op de database uitgevoerd.

Het zal zoiets moeten worden:
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
<?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);
?>
 
Berta Pappens

Berta Pappens

13/10/2020 17:47:01
Quote Anchor link
Hallo Thomas,

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 ?
 
Thomas van den Heuvel

Thomas van den Heuvel

13/10/2020 17:54:56
Quote Anchor link
Wat zegt mysqli_error($con) na afloop van de tweede query?
 
Berta Pappens

Berta Pappens

14/10/2020 10:22:55
Quote Anchor link
Thomas,

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.
 
- Ariën -
Beheerder

- Ariën -

14/10/2020 11:04:27
Quote Anchor link
Wat doet een echo op $sql ?
 
Berta Pappens

Berta Pappens

14/10/2020 11:13:10
Quote Anchor link
Ariën,

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 ..
 
- Ariën -
Beheerder

- Ariën -

14/10/2020 11:21:28
Quote Anchor link
Voer deze querie eens zo uit in phpMyAdmin.

Ik raad wel aan om dit te escapen. Want bij Jacques 'd Ancona zal de query vanwege de apostrof onderuit gaan.
 
Berta Pappens

Berta Pappens

14/10/2020 11:24:27
Quote Anchor link
Thomas, Ariën,

Iedereen bedankt , maar ik heb het gevonden.
Het was het volgende :
Voor de uitvoering gewoon $naam = mysqli_real_escape_string($con, $naam);

iedereen bedankt
 
- Ariën -
Beheerder

- Ariën -

14/10/2020 11:31:55
Quote Anchor link
Zonder die functie zou Dirk moeten werken, Jacques 'd Ancona weer niet.
 
Ivo P

Ivo P

14/10/2020 12:55:07
Quote Anchor link
en werkt het dan zonder backtics om de `kolomnamen`?

User en Code hebben namelijk voor Mysql ook een betekenis.
 
Berta Pappens

Berta Pappens

14/10/2020 13:20:16
Quote Anchor link
Nee met backtics
 



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.