Update PHP query werkt niet
Onderstaande code gebruik ik om de waarde van een kolom bij te werken naar het getal 2, nadat een gebruiker op de verzendknop heeft gedrukt.
En, helaas werkt het niet en ik krijg allemaal foutmelding.
De foutmelding zijn o.a.:
med_expire.php' on line 111: mysqli_affected_rows() expects parameter 1 to be mysqli, null given
Bizar genoeg, wanneer ik binnen PHPMyAdmin de query "UPDATE medicines SET verwijderd = 2 WHERE ID = 55; uitvoer, dan werkt het wel.
Gewijzigd op 25/08/2017 21:57:59 door Mohamed nvt
En wat zegt de foutafhandeling?
Foutafhandeling checken.
Ikzelf gebruik MySQLi-OO en heb een extended class gemaakt die de query() overschrijft mét foutafhandeling erbij.
Misschien een tipje als niet steeds systematisch foutafhandeling erbij wilt schrijven.
Gewijzigd op 25/08/2017 22:04:45 door - Ariën -
Via foutafhandeling krijg ik o.a bovenstaande foutmelding en:
Undefined variable: dbc
En de DBC variabel klopt wel, maar eerder werkt het wel in het script.
Via de dump krijg ik:
[query] => UPDATE medicines SET verwijderd = 2 WHERE id=55
[r] =>
Maar ook hierin zie ik geen foutmelding eigenlijk...En de kolomnamen kloppen reeds wel, want in PHPMyAdmin werkt deze query wel en zonder problemen.
@- Ariën -,
Zie je een SQL injectie bij where id? Dit heb ik net ook ontdekt, nadat ik eerst op het net ging zoeken voor 'n oplossing voor mijn probleem. En jah ik programmeer in procedure, want ik ben nog niet toe aan OOP. Ooit wil ik wel overgaan, maar eerst de applicatie moet af zijn.. ;-)
Gewijzigd op 25/08/2017 22:12:03 door Mohamed nvt
Je parameter mist, en dat is de connectie-identifier.
Gewijzigd op 25/08/2017 22:10:57 door Ben van Velzen
Ja de $dbc is voor de verbinding naar mysql-database.
En kun je dan verklaren waarom de $dbc eerder wel werkte in het script?
Indien nodig kan ik hier het hele script laten zien?
En jah ik pas ook de correcte foutafhandeling, want ik krijg elke keer een mail wanneer iets fout gaat plus dump van het script..
Gebruik je geen eigen functie, waarin je $dbc opeens niet meer werkt?
Nee, maar zou het kunnen zijn dat $dbc niet meer werkt, nadat ik PHP script heb afgebroken en later weer open?
unset() je die waarde gewoon niet? Of overschrijf je het ergens met een lege waarde?
Dit is het hele script, mocht iemand een fout kunnen detecteren:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
?>
<?php
require ('includes/config.inc.php');
include ('includes/header.php');
?>
<?php
if (!isset($_SESSION['user_id'])) {
header("Location: login.php");
exit(); // Quit the script.
} ?>
<!--de content van elk nieuwe pagina moet in deze sectie beginnen-->
<?php
if (isset($_GET['id']) && !empty($_GET['id']) && is_numeric($_GET['id'])){
// Need the database connection:
require(MYSQL);
// Define the query.
$query = "SELECT
medicines.id,
medicines.medicinename,
medicines.genericname,
medicines.quantity,
medicines.expiredate,
medicines.sellingprice,
medicines.purchaseprice,
medicinescompany.companyname,
medicinescountry.countryname,
medicinestype.medicinetypename,
suppliers.suppliername
FROM medicines
LEFT JOIN users ON users.user_id = medicines.userid
LEFT JOIN medicines_medicinescompany ON medicines_medicinescompany.medicine_id=medicines.id
LEFT JOIN medicinescompany ON medicines_medicinescompany.medicinecompany_id=medicinescompany.id
LEFT JOIN medicines_medicinescountry ON medicines_medicinescountry.medicine_id=medicines.id
LEFT JOIN medicinescountry ON medicines_medicinescountry.medicinecountry_id=medicinescountry.id
LEFT JOIN medicines_suppliers ON medicines_suppliers.medicine_id=medicines.id
LEFT JOIN suppliers ON medicines_suppliers.supplier_id=suppliers.id
LEFT JOIN medicines_medicinestype ON medicines_medicinestype.medicine_id=medicines.id
LEFT JOIN medicinestype ON medicines_medicinestype.medicinetype_id=medicinestype.id
where
medicines.id='". mysqli_real_escape_string($dbc, $_GET['id'])."' AND users.user_id = '{$_SESSION['user_id']}'";
if ($result = mysqli_query($dbc, $query)) { // Run the query.
$row = mysqli_fetch_array($result);// Retrieve the information.
?>
<form action="med_expire.php" method="post">
<table>
<caption>Expire Insight Form</caption>
<input type="hidden" name="id" value="<?php echo htmlentities($row['id']);?>">
<tr>
<td><label for="medicinename"><b>Medicine Name:</b></label></td>
<td><input type="text" name="medicinename" id="medicinename" value="<?php echo htmlentities($row['medicinename']);?>" readonly/></td>
</tr>
<tr>
<td><label for="genericname"><b>Generic Name:</b></label></td>
<td><input type="text" name="genericname" id="genericname" value="<?php echo htmlentities($row['genericname']); ?>" readonly/></td>
</tr>
<tr>
<td><label for="expiredate"><b>ExpireDate:</b></label></td>
<td><input type="text" name="expiredate" id="expiredate" value="<?php echo htmlentities($row['expiredate']); ?>" readonly/></td>
</tr>
<tr>
<td><label for="quantity"><b>Quantity:</b></label></td>
<td><input type="text" name="quantity" id="quantity" value="<?php echo htmlentities($row['quantity']); ?>" readonly/></td>
</tr>
<tr>
<td><label for="sellingprice"><b>SellingPrice:</b></label></td>
<td><input type="text" name="sellingprice" id="sellingprice" value="<?php echo htmlentities($row['sellingprice']); ?>" readonly/></td>
</tr>
<tr>
<td><label for="purchaseprice"><b>PurchasePrice:</b></label></td>
<td><input type="text" name="purchaseprice" id="purchaseprice" value="<?php echo htmlentities($row['purchaseprice']); ?>" readonly/></td>
</tr>
<tr>
<td><label for="companyname"><b>CompanyName:</b></label></td>
<td><input type="text" name="companyname" id="companyname" value="<?php echo htmlentities($row['companyname']); ?>" readonly/></td>
</tr>
<tr>
<td><label for="countryname"><b>CompanyName:</b></label></td>
<td><input type="text" name="countryname" id="countryname" value="<?php echo htmlentities($row['countryname']); ?>" readonly/></td>
</tr>
<tr>
<td><label for="medicinetypename"><b>MedicineTypeName</b></label></td>
<td><input type="text" name="medicinetypename" id="medicinetypename" value="<?php echo htmlentities($row['medicinetypename']); ?>" readonly/></td>
</tr>
<tr>
<td><label for="suppliername"><b>SupplierName:</b></label></td>
<td><input type="text" name="suppliername" id="suppliername" value="<?php echo htmlentities($row['suppliername']); ?>" readonly/></td>
</tr>
<tr>
<td><input type="submit" name="submit" value="Remove from Expire View"></td>
</tr>
</table>
</form>
<?php
} else { // Couldn't get the information.
echo '<p style="color: red;">Could not retrieve the medicine ID</p>';
}
} elseif (isset($_POST['id']) && is_numeric($_POST['id'])) { // Handle the form.
$problem = FALSE;
if (!$problem) {
// Define the query.
$query = "UPDATE medicines SET verwijderd = 2 WHERE id={$_POST['id']}";
$r = mysqli_query($dbc, $query); // Execute the query.
// Report on the result:
if (mysqli_affected_rows($dbc) == 1) {
print '<p>This medicine has been removed from the Expire View.</p>';
} else {
echo '<p style="color: red;">Could not update the entry<br></p>';
}
} // No problem!
} else { // No ID set.
print '<p style="color: red;">This page has been accessed in error.</p>';
} // End of main IF.
?>
<!--ending header-->
<?php
include ('includes/footer.php');
?>
error_reporting(E_ALL);
ini_set('display_errors', 'On');
?>
<?php
require ('includes/config.inc.php');
include ('includes/header.php');
?>
<?php
if (!isset($_SESSION['user_id'])) {
header("Location: login.php");
exit(); // Quit the script.
} ?>
<!--de content van elk nieuwe pagina moet in deze sectie beginnen-->
<?php
if (isset($_GET['id']) && !empty($_GET['id']) && is_numeric($_GET['id'])){
// Need the database connection:
require(MYSQL);
// Define the query.
$query = "SELECT
medicines.id,
medicines.medicinename,
medicines.genericname,
medicines.quantity,
medicines.expiredate,
medicines.sellingprice,
medicines.purchaseprice,
medicinescompany.companyname,
medicinescountry.countryname,
medicinestype.medicinetypename,
suppliers.suppliername
FROM medicines
LEFT JOIN users ON users.user_id = medicines.userid
LEFT JOIN medicines_medicinescompany ON medicines_medicinescompany.medicine_id=medicines.id
LEFT JOIN medicinescompany ON medicines_medicinescompany.medicinecompany_id=medicinescompany.id
LEFT JOIN medicines_medicinescountry ON medicines_medicinescountry.medicine_id=medicines.id
LEFT JOIN medicinescountry ON medicines_medicinescountry.medicinecountry_id=medicinescountry.id
LEFT JOIN medicines_suppliers ON medicines_suppliers.medicine_id=medicines.id
LEFT JOIN suppliers ON medicines_suppliers.supplier_id=suppliers.id
LEFT JOIN medicines_medicinestype ON medicines_medicinestype.medicine_id=medicines.id
LEFT JOIN medicinestype ON medicines_medicinestype.medicinetype_id=medicinestype.id
where
medicines.id='". mysqli_real_escape_string($dbc, $_GET['id'])."' AND users.user_id = '{$_SESSION['user_id']}'";
if ($result = mysqli_query($dbc, $query)) { // Run the query.
$row = mysqli_fetch_array($result);// Retrieve the information.
?>
<form action="med_expire.php" method="post">
<table>
<caption>Expire Insight Form</caption>
<input type="hidden" name="id" value="<?php echo htmlentities($row['id']);?>">
<tr>
<td><label for="medicinename"><b>Medicine Name:</b></label></td>
<td><input type="text" name="medicinename" id="medicinename" value="<?php echo htmlentities($row['medicinename']);?>" readonly/></td>
</tr>
<tr>
<td><label for="genericname"><b>Generic Name:</b></label></td>
<td><input type="text" name="genericname" id="genericname" value="<?php echo htmlentities($row['genericname']); ?>" readonly/></td>
</tr>
<tr>
<td><label for="expiredate"><b>ExpireDate:</b></label></td>
<td><input type="text" name="expiredate" id="expiredate" value="<?php echo htmlentities($row['expiredate']); ?>" readonly/></td>
</tr>
<tr>
<td><label for="quantity"><b>Quantity:</b></label></td>
<td><input type="text" name="quantity" id="quantity" value="<?php echo htmlentities($row['quantity']); ?>" readonly/></td>
</tr>
<tr>
<td><label for="sellingprice"><b>SellingPrice:</b></label></td>
<td><input type="text" name="sellingprice" id="sellingprice" value="<?php echo htmlentities($row['sellingprice']); ?>" readonly/></td>
</tr>
<tr>
<td><label for="purchaseprice"><b>PurchasePrice:</b></label></td>
<td><input type="text" name="purchaseprice" id="purchaseprice" value="<?php echo htmlentities($row['purchaseprice']); ?>" readonly/></td>
</tr>
<tr>
<td><label for="companyname"><b>CompanyName:</b></label></td>
<td><input type="text" name="companyname" id="companyname" value="<?php echo htmlentities($row['companyname']); ?>" readonly/></td>
</tr>
<tr>
<td><label for="countryname"><b>CompanyName:</b></label></td>
<td><input type="text" name="countryname" id="countryname" value="<?php echo htmlentities($row['countryname']); ?>" readonly/></td>
</tr>
<tr>
<td><label for="medicinetypename"><b>MedicineTypeName</b></label></td>
<td><input type="text" name="medicinetypename" id="medicinetypename" value="<?php echo htmlentities($row['medicinetypename']); ?>" readonly/></td>
</tr>
<tr>
<td><label for="suppliername"><b>SupplierName:</b></label></td>
<td><input type="text" name="suppliername" id="suppliername" value="<?php echo htmlentities($row['suppliername']); ?>" readonly/></td>
</tr>
<tr>
<td><input type="submit" name="submit" value="Remove from Expire View"></td>
</tr>
</table>
</form>
<?php
} else { // Couldn't get the information.
echo '<p style="color: red;">Could not retrieve the medicine ID</p>';
}
} elseif (isset($_POST['id']) && is_numeric($_POST['id'])) { // Handle the form.
$problem = FALSE;
if (!$problem) {
// Define the query.
$query = "UPDATE medicines SET verwijderd = 2 WHERE id={$_POST['id']}";
$r = mysqli_query($dbc, $query); // Execute the query.
// Report on the result:
if (mysqli_affected_rows($dbc) == 1) {
print '<p>This medicine has been removed from the Expire View.</p>';
} else {
echo '<p style="color: red;">Could not update the entry<br></p>';
}
} // No problem!
} else { // No ID set.
print '<p style="color: red;">This page has been accessed in error.</p>';
} // End of main IF.
?>
<!--ending header-->
<?php
include ('includes/footer.php');
?>
Waar maak je $dbc dan eigenlijk aan?
Vandaar require(mysql)
En zoals je ziet, werkt $dbc wel in het script door gegevens uit DB te halen en anders zou $dbc vanaf het begin niet werken, toch?
En daarom denk ik dat het probleem ergens anders in zit. Initieel dacht ik dat het kolomnaam niet klopt, maar die klopt wel en dezelfde script werkt wel in PHPMyAdmin
Gewijzigd op 25/08/2017 22:40:21 door Mohamed nvt
Gewijzigd op 25/08/2017 22:44:40 door Ben van Velzen
Voordat ik de query uitvoer om de waarde van kolom verwijderd aan te passen, heb ik opnieuw require(MYSQL) toegevoerd en nu werkt de script wel en zonder foutmeldingen.
Dit heb ik eerder niet meegemaakt, maar blijkbaar moest ik opnieuw de connectie met DB toe te voegen, nadat ik PHP script had afgebroken en later opnieuw begon.
Bedankt voor het meedenken.
Ik zou het toch eens gaan debuggen met var_dump op elke plek, en net zo lang door gaan tot dat de waarde opeens weg is.
Als je met require(MYSQL); $dbc aanmaakt dan moet je die regel op regel 8 zetten lijkt mij en niet tussen een if().
Dat was mijn punt over conditionele includes inderdaad. Als je een databaseverbinding nodig hebt zet je die gewoon bovenaan in je script.
Weer wat geleerd. Bedankt voor jullie feedback ;-)