Hulp bij MYSQL
Ik laat een listing van mij database zien op het scherm.
Daarin zit een zoekfunctie op code op waypoint of legger.
Als ik bij de code "GC100D" invul krijg ik 2 records (dat is perfect)
Als ik bij de andere 2 iets ingeef krijg ik altijd de melding :
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\demo\test_listing.php on line 96
Lijn 96 is : while($row = mysqli_fetch_array($result))
Waarom bij code niet en bij de andere wel ?
Hier een stuk van mijn code :
Kan iemand mij zeggen waarom het juist loopt bij $by_code en bij de twee andere niet.
Dank Bij voorbaat
Daarin zit een zoekfunctie op code op waypoint of legger.
Als ik bij de code "GC100D" invul krijg ik 2 records (dat is perfect)
Als ik bij de andere 2 iets ingeef krijg ik altijd de melding :
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\demo\test_listing.php on line 96
Lijn 96 is : while($row = mysqli_fetch_array($result))
Waarom bij code niet en bij de andere wel ?
Hier een stuk van mijn code :
Quote:
if(isset($_POST['submit'])) {
$by_code=$_POST['by_code'];
$by_oms=$_POST['by_oms'];
$by_leg=$_POST['by_leg'];
if($by_code !="") {
$result = mysqli_query($con,"SELECT * FROM database_bel WHERE Code LIKE '%$by_code%' LIMIT $offset, $total_records_per_page");
}
if($by_oms !="") {
$result = mysqli_query($con,"SELECT * FROM database_bel WHERE Waypoint naam LIKE '%$by_oms%'LIMIT $offset, $total_records_per_page");
}
if($by_leg !="") {
$result = mysqli_query($con,"SELECT * FROM database_bel WHERE Owner Name LIKE '%$by_leg%'LIMIT $offset, $total_records_per_page");
}
}
if(isset($_POST['submit'])) {
$by_code=$_POST['by_code'];
$by_oms=$_POST['by_oms'];
$by_leg=$_POST['by_leg'];
if($by_code !="") {
$result = mysqli_query($con,"SELECT * FROM database_bel WHERE Code LIKE '%$by_code%' LIMIT $offset, $total_records_per_page");
}
if($by_oms !="") {
$result = mysqli_query($con,"SELECT * FROM database_bel WHERE Waypoint naam LIKE '%$by_oms%'LIMIT $offset, $total_records_per_page");
}
if($by_leg !="") {
$result = mysqli_query($con,"SELECT * FROM database_bel WHERE Owner Name LIKE '%$by_leg%'LIMIT $offset, $total_records_per_page");
}
}
Kan iemand mij zeggen waarom het juist loopt bij $by_code en bij de twee andere niet.
Dank Bij voorbaat
Zo op het blote oog gezien, ontbreekt voor LIMIT een spatie.
Gewijzigd op 01/10/2020 11:36:53 door Adoptive Solution
Dat is het niet, heb er een spatie aan toegevoegd maar krijg nog steeds dezelfde fout.
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\demo\test_listing.php on line 96
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\demo\test_listing.php on line 96
Kijk eens met mysqli_error($con) wat het probleem is.
Klopt dit?
Waypoint naam
Owner Name
Zijn elk 2 losse veldnamen.
Waypoint naam
Owner Name
Zijn elk 2 losse veldnamen.
Ariën,
Ik krijg code 1064 .
Ik krijg code 1064 .
Wat Adoptive zegt, die veldnamen kunnen echt niet. Je kunt ze tussen backticks of brackets zetten, maar beter hernoem je die velden gewoon.
Code is een 'reserved word', vandaar die error. Dus ook deze hernoemen of backticks (afgeraden!)
Daarnaast is if(isset($_POST['submit'])) geen manier om te controleren of een formulier is gepost, en is het kopiëren van variabelen onnodig als je er verder niks mee doet.
En variabelen buiten quotes.
Moet het niet else if zijn ipv if? Anders overschrijft die de $result als er aan meerdere POST waarden wordt voldaan.
Beetje foutafhandeling en veiligheid zou handig zijn.
Code is een 'reserved word', vandaar die error. Dus ook deze hernoemen of backticks (afgeraden!)
Daarnaast is if(isset($_POST['submit'])) geen manier om te controleren of een formulier is gepost, en is het kopiëren van variabelen onnodig als je er verder niks mee doet.
En variabelen buiten quotes.
Moet het niet else if zijn ipv if? Anders overschrijft die de $result als er aan meerdere POST waarden wordt voldaan.
Beetje foutafhandeling en veiligheid zou handig zijn.
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
40
41
42
43
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
40
41
42
43
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST') {
if(isset($_POST['by_code']) && $_POST['by_code'] != "") {
$result = mysqli_query($con,
"SELECT
*
FROM
database_bel
WHERE
`Code`
LIKE
'%" . mysqli_real_escape_string($con, $_POST['by_code']) . "%'
LIMIT
" . $offset . ", " . $total_records_per_page);
}
else if(isset($_POST['by_oms']) && $_POST['by_oms'] != "") {
$result = mysqli_query($con,
"SELECT
*
FROM
database_bel
WHERE
`Waypoint naam`
LIKE
'%" . mysqli_real_escape_string($con, $_POST['by_oms']) . "%'
LIMIT
" . $offset . ", " . $total_records_per_page);
}
else if(isset($_POST['by_leg']) && $_POST['by_leg'] != "") {
$result = mysqli_query($con,
"SELECT
*
FROM
database_bel
WHERE
`Owner Name`
LIKE
'%" . mysqli_real_escape_string($con, $_POST['by_leg']) . "%'
LIMIT
" . $offset . ", " . $total_records_per_page);
}
}
?>
if($_SERVER['REQUEST_METHOD'] == 'POST') {
if(isset($_POST['by_code']) && $_POST['by_code'] != "") {
$result = mysqli_query($con,
"SELECT
*
FROM
database_bel
WHERE
`Code`
LIKE
'%" . mysqli_real_escape_string($con, $_POST['by_code']) . "%'
LIMIT
" . $offset . ", " . $total_records_per_page);
}
else if(isset($_POST['by_oms']) && $_POST['by_oms'] != "") {
$result = mysqli_query($con,
"SELECT
*
FROM
database_bel
WHERE
`Waypoint naam`
LIKE
'%" . mysqli_real_escape_string($con, $_POST['by_oms']) . "%'
LIMIT
" . $offset . ", " . $total_records_per_page);
}
else if(isset($_POST['by_leg']) && $_POST['by_leg'] != "") {
$result = mysqli_query($con,
"SELECT
*
FROM
database_bel
WHERE
`Owner Name`
LIKE
'%" . mysqli_real_escape_string($con, $_POST['by_leg']) . "%'
LIMIT
" . $offset . ", " . $total_records_per_page);
}
}
?>
Gewijzigd op 01/10/2020 13:02:48 door Michael -
Dank je wel, het was voldoende om de velden tussen `waypoint naam` te plaatsen.
Nogmaals dank , het is opgelost.
Nogmaals dank , het is opgelost.
Indien nog mogelijk zou ik toch echt de naam van die kolom veranderen. Bijvoorbeeld de spatie vervangen door _
Dit gaat op langere termijn steeds vaker problemen op leveren
Dit gaat op langere termijn steeds vaker problemen op leveren
waarbij dat streepje van Ramon dan een underscore is: _ en niet een - .
Want daarmee zou het een "min" zijn, waardoor je met Waypoint-naam dan de betekenis krijgt "waarde uit de kolom waypoint minus de waarde uit de kolom naam".
Want bedenk je vast dat je nog wel eens hier en daar een query gaat typen waar je de `` gaat vergeten.
En dan mag hopen dat je geen andere betekenis aan je query geeft.
Want daarmee zou het een "min" zijn, waardoor je met Waypoint-naam dan de betekenis krijgt "waarde uit de kolom waypoint minus de waarde uit de kolom naam".
Want bedenk je vast dat je nog wel eens hier en daar een query gaat typen waar je de `` gaat vergeten.
En dan mag hopen dat je geen andere betekenis aan je query geeft.
Maar als je meer velden invult, dan wil je toch dat dat een inclusieve of exclusieve match oplevert?
Dus als je A en B invult dat je ook enkel resultaten wilt hebben waar ofwel:
- A of B matcht (ten minste een van de twee)
- A èn B matcht (beide)
Hierboven wordt ook meerdere keren dezelfde aardappelstempel gehanteerd - elke keer een aparte query voor een enkele zoekterm.
Ik denk dat het voor zoekfunctionaliteit doorgaans beter werkt wanneer je één query opbouwt waarin een of meer zoektermen worden opgenomen.
Misschien gebruik je dat op dit moment niet of heb je het (nog) niet nodig, maar het is zeker het overwegen waard.
In jouw variant wordt ook de laatst ingevulde variant gepakt ($by_leg) waarbij $result telkens wordt overschreven, en in de variant van @Michael wordt de eerste ingevulde variant gepakt, dus in dat opzicht is het gedrag van de code -en daarmee de uiteindelijk gebruikte zoekquery- ook anders.
Dus als je A en B invult dat je ook enkel resultaten wilt hebben waar ofwel:
- A of B matcht (ten minste een van de twee)
- A èn B matcht (beide)
Hierboven wordt ook meerdere keren dezelfde aardappelstempel gehanteerd - elke keer een aparte query voor een enkele zoekterm.
Ik denk dat het voor zoekfunctionaliteit doorgaans beter werkt wanneer je één query opbouwt waarin een of meer zoektermen worden opgenomen.
Misschien gebruik je dat op dit moment niet of heb je het (nog) niet nodig, maar het is zeker het overwegen waard.
In jouw variant wordt ook de laatst ingevulde variant gepakt ($by_leg) waarbij $result telkens wordt overschreven, en in de variant van @Michael wordt de eerste ingevulde variant gepakt, dus in dat opzicht is het gedrag van de code -en daarmee de uiteindelijk gebruikte zoekquery- ook anders.
Gewijzigd op 01/10/2020 17:15:25 door Thomas van den Heuvel
Algemeen gebruik van de constructie
is af te raden omdat het niet altijd veilig is.
Stel dat $_POST['val'] de waarde '1 OR TRUE' bevat, en $sql "SELECT * FROM table WHERE id = $iId", dan zou iemand veel meer informatie kunnen zien dan dat de bedoeling is.
De enige twee goede manieren om variabelen door te geven aan een database zijn
- de inhoud kloppend maken. Dat is lastig, behalve bij getallen: $iId = (int) $iId
- prepared statements
is af te raden omdat het niet altijd veilig is.
Stel dat $_POST['val'] de waarde '1 OR TRUE' bevat, en $sql "SELECT * FROM table WHERE id = $iId", dan zou iemand veel meer informatie kunnen zien dan dat de bedoeling is.
De enige twee goede manieren om variabelen door te geven aan een database zijn
- de inhoud kloppend maken. Dat is lastig, behalve bij getallen: $iId = (int) $iId
- prepared statements
Ad Fundum op 09/10/2020 16:40:52:
De enige twee goede manieren om variabelen door te geven aan een database zijn
- de inhoud kloppend maken.
- prepared statements
- de inhoud kloppend maken.
- prepared statements
quotes icm real_escape_string werkt prima. Het een is niet veilig zonder het ander.
Ad Fundum op 09/10/2020 16:40:52:
Dat is lastig, behalve bij getallen: $iId = (int) $iId
Mja, maar dan moet je de hele tijd nadenken over / in de query en code nagaan of $iId nu expres niet ge-escaped is of dat het per ongeluk toch vergeten was. Beter is om gewoon simpelweg overal quotes + escaping toe te passen (als je niet met prepared statements werkt) (edit: en de input natuurlijk even valideren), het is niet alsof MySQL hier een traan om zal laten omdat deze toch (op zijn minst in de niet-prepared statement modus volgems mij) redelijk type-ongevoelig is.
Gewijzigd op 10/10/2020 21:26:43 door Thomas van den Heuvel




