Ik wil een update uitvoeren maar dat lukt - ineens - niet meer. Een update een minuut eerder lukte wel en toen niet meer. Ik krijg de foutmelding
"mysqli_error() expects exactly 1 argument, 0 given in C:\wamp\www\modellenEdit.php on line 44"
Eerst dacht ik dat ik verboden tekens wilde plaatsen zoals / of dat ik tekst wilde plaatsen in een kolom voor alleen cijfers, maar dat bleek niet het geval te zijn.
Je weet toch wat een string is, en wat een query is? En ook hoe een echo werkt?
<?php
//Controle of bij te werken waarden correct zijn.
$_POST['set'] = ''; // Dit kan een lege string zijn
// Controleer of de variabele leeg is, zo ja, gebruik NULL
$variabele_sql = empty($variabele) ? "NULL" : "'" . mysqli_real_escape_string($variabele) . "'";
$queryUpdate = "UPDATE modellen SET start_set = '".$_POST['set']."'";
echo "De SQL-query is: ".$queryUpdate;
// en dan het uitvoeren etc....
?>
Je weet toch wat een string is, en wat een query is? En ook hoe een echo werkt?
Neen, tot jullie erover begonnen, had ik nog nooit van een echo van gehoord. De laatste jaren heb ik me niet meer in php verdiept, het overzicht van mijn treinmodellen was af en werkte. Dus de noodzaak ontbrak.
[size=xsmall]Toevoeging op 27/10/2024 15:59:59:[/size]
Ik heb dit in mijn script gezet, conform jouw suggestue:
$_POST['set'] = ''; // Dit kan een lege string zijn
// Controleer of de variabele leeg is, zo ja, gebruik NULL
$variabele_sql = empty($variabele) ? "NULL" : "'" . mysqli_real_escape_string($variabele) . "'";
//control of pagina zichzelf heeft aangeroepen via hidden field uit formulier aan eind van deze pagina
//if (!EMPTY ($_POST['set'])){$_POST['set'] = (int)$_POST['set'];}
//Controles over de aard van $_POST['set']
//echo var_dump(is_string($_POST['set']));
echo "De SQL-query is: ".$queryUpdate;
IF(isset($_POST['JA']))
{ //query samenstellen
$queryUpdate = etc etc etc
Eerst krijg ik een waarschuwing: Undefined variable $queryUpdate in C:\wamp\www\modellenEdit.php on line
Dat klopt, is een lege string.
Voer ik de queryUPDATE uit, dan krijg ik:
De SQL-query is: Wijzigen is niet gelukt.
Incorrect integer value: '' for column 'start_set' at row 1
Query: UPDATE modellen SET merk = '10 ', artikelnummer = '37075', maatschappij = '6', soort = '20', bedrijf = '', reeks = '232TC 411', klasse = '4', asindeling = '24', lengte = '16.00', interieur = 'nee', verlichting = '10', tijdperk = '2', aantal = '1', railsysteem = '2', stroomsoort = '4', wielmerk = '10', wieldiameter = '0', wielaslengte = '0', motor = '4', gemotoriseerd = 'ja', decoder = '4', protocol = '5', adres = 'auto', consist_adres = '', bijzonderheden = '', extra_informatie = 'Oorspronkelijk Pruisisch ontwerp (T18) voor de Reichseisenbahnen in Elsaß-Lothringen. Door de SNCF werden de locomotieven geregistreerd als SNCF Serie 1-232 TC met de nummers 401 t/m 427.', modelinfo = '', categorie = '3', afbeelding = '218', OVP = '2', start_set = '' WHERE id=202
Bedoelen jullie dit met de echo??? Ja, die ken ik zo langzamerhand wel. Eerder noemde ik dat de uitkomst van mysqli_error($db)
[size=xsmall]Toevoeging op 27/10/2024 16:06:09:[/size]
In mijn reactie op 25 okt gaf ik een serie testen met verschillende waarden van $_POST['set']. Mijn conclusie dat geen van allen werkten was gebaseerd op de "echo's": incorrect integer value. Alle waarden die tot nu toe uit het formulier zijn gekomen, waren strings.
[size=xsmall]Toevoeging op 27/10/2024 16:21:17:[/size]
Ozzie PHP op 26/10/2024 17:47:08
De waarde leeglaten kan wel, maar dan moet je dus een controle doen: als de waarde leeg is, voer dan NULL in in je query. En zoals Ariën al aangaf moet NULL dan geen string zijn.
'dit is een string'
'NULL' => dit is ook een string!
NULL => dit is NULL (dus geen string) en dit moet je gebruiken in je query
Als ik in min script dit schrijf: value=null
Dat levert dat ook de echo/foutmelding op:
De SQL-query is: Wijzigen is niet gelukt.
Incorrect integer value: '' for column 'start_set' at row 1
Mijn idee is: Alles wat ik in value type en aan $_POST[] wordt toegekend is een string. Dat is niet het geval als de waarde die aan $_POST[] wordt meegegeven als integer uit de database gehaald is en aan een tijdelijke variabele is toegekend en vervolgens in het formulier als waarde wordt verzonden.
Hier de meest relevante regels uit mijn script, dus alleen die die betrekking hebben op veld "startset" = $_POST['set']. Alle andere heb ik weggelaten.
Je ziet dat ik hier NULL in de database wil zetten, i.p.v. van de 0 die er nu staat. Zie de regel met value=null.
Maar ik kan er ook 0 of '0' of "0" neerzetten. Het maakt allemaal niet uit, alleen de regel if (!EMPTY ($_POST['set'])){$_POST['set'] = (int)$_POST['set'];} maakt het verschil. Maar ook dan blijft er een 0 in de tabel staan.
<?php
include 'inc\inc_connect_db.php';
if (!EMPTY ($_POST['set'])){$_POST['set'] = (int)$_POST['set'];}
IF(isset($_POST['JA']))
{ //query samenstellen
$queryUpdate =
"UPDATE
modellen
SET
start_set = '".$_POST['set']."'
WHERE
id=".$_POST['id'];
$resultEdit = mysqli_query($db, $queryUpdate) or die("Wijzigen is niet gelukt.<br />" . mysqli_error($db) . "<br /> Query: " . $queryUpdate);
$resultEdit = TRUE;
if($resultEdit === TRUE)
{
echo("Rij nummer".$_POST['id']." is bijgewerkt<br>\n");
echo("<a href=\"javascript:window.close()\">Terug naar overzicht</a>");
}
}
ELSE
{
//indien pagina zichzelf nog nietheeft aangeroepen wijzigingsformulier op scherm zetten
$queryForm = "SELECT * FROM modellen WHERE modellen.id LIKE '".$_GET['id']."'";
$resultForm = mysqli_query($db, $queryForm ) or die ("Er is iets fout gegaan bij het ophalen van gegevens.<br />" . mysql_error() . "<br /> Query: " . $queryForm);
?>
<html>
<head>
<title>Formulier wijzig beschrijving modellen</title>
<link rel="stylesheet" type="text/css" href="css/modellen.css"/>
<script language="javascript" type="text/javascript" src="scripts/popup_mysqldb_adddeledit.js"></script>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
</head>
<?php //gegevens uit tabel ophalen en toekennen aan tijdelijke variabelen
while($rij=mysqli_fetch_array($resultForm))
{
$set_id = $rij['start_set'];
}
//(start)sets
if (empty ($set_id)) {$Set[] = "<option SELECTED value=null>n.v.t.</option>\n"; }
// de bestaande startsets uit database halen
$resultSet = mysqli_query($db,
"SELECT * FROM sets ORDER BY Naam") or die ("ophalen (start)sets is niet gelukt.<br />");
while ($set = mysqli_fetch_assoc($resultSet))
{
if ($set['id_set'] == $set_id)
{
$Set[] = "<option SELECTED value=\"".$set['id_set']."\">".$set['Naam']."</option>\n";
}
else
{
$Set[] = "<option value=\"".$set['id_set']."\">".$set['Naam']."</option>\n";
}
}
?>
<body>
<h2>Wijzig deze gegevens</h2>
<p><i>Record nr: <?php echo $_GET['id'] ?></i></p>
<form action="<?php echo($_SERVER["PHP_SELF"]);?>" method="post">
<input type="hidden" name="JA" value="1">
<input type="hidden" name="id" value="<?php echo($_GET['id']);?>">
<table width="100%">
<tr>
<td>(Start)set</td>
<td>
<select name="set"><?php foreach($Set AS $sets) echo $sets ?></select>
</td>
</tr>
</table>
<input type="Submit" value="Wijzigingen bijwerken">
<input type="Button" value="Nee, terug naar overzicht" onclick="javascript:self.close();">
</form>
<?php
//hier wordt else-blok af gesloten
}
?>
</body>
</html>
[quote="- Ariën - op 26/10/2024 23:25:53"]
Je weet toch wat een string is, en wat een query is? En ook hoe een echo werkt?
Neen, tot jullie erover begonnen, had ik nog nooit van een echo van gehoord. De laatste jaren heb ik me niet meer in php verdiept, het overzicht van mijn treinmodellen was af en werkte. Dus de noodzaak ontbrak.
[/quote]
Nog nooit van 'echo gehoord? Ik schaam me, natuurlijk ken ik 'echo'. Elke keer als ik iets op het scherm wilde zien, gebruikte ik 'echo'. Alleen in combi met mysql-query kende ik het niet.
[size=xsmall]Toevoeging op 28/10/2024 15:26:57:[/size]
- Ariën - op 27/10/2024 22:45:01
Wat Ozzie zegt, het wordt als een string behandeld. Laat de value in de option gewoon leeg, doe een check met empty, en gebruik dan NULL in je query.
Zie hier wat ik ervan gemaakt heb
<?php
include 'inc\inc_connect_db.php';
if (empty($_POST['set']))
{
$_POST['set'] = null;
}
else {$_POST['set'] = (int)$_POST['set'];}
echo "De SQL-query is: ".$queryUpdate;
IF(isset($_POST['JA']))
{ //query samenstellen
$queryUpdate =
"UPDATE
modellen
SET
start_set = '".$_POST['set']."'
WHERE
id=".$_POST['id'];
$resultEdit = mysqli_query($db, $queryUpdate) or die("Wijzigen is niet gelukt.<br />" . mysqli_error($db) . "<br /> Query: " . $queryUpdate);
$resultEdit = TRUE;
if($resultEdit === TRUE)
{
echo("Rij nummer".$_POST['id']." is bijgewerkt<br>\n");
echo("<a href=\"javascript:window.close()\">Terug naar overzicht</a>");
}
}
ELSE
{
//indien pagina zichzelf nog nietheeft aangeroepen wijzigingsformulier op scherm zetten
$queryForm = "SELECT * FROM modellen WHERE modellen.id LIKE '".$_GET['id']."'";
$resultForm = mysqli_query($db, $queryForm ) or die ("Er is iets fout gegaan bij het ophalen van gegevens.<br />" . mysql_error() . "<br /> Query: " . $queryForm);
?>
<html>
<head>
<title>Formulier wijzig beschrijving modellen</title>
<link rel="stylesheet" type="text/css" href="css/modellen.css"/>
<script language="javascript" type="text/javascript" src="scripts/popup_mysqldb_adddeledit.js"></script>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
</head>
<?php //gegevens uit tabel ophalen en toekennen aan tijdelijke variabelen
while($rij=mysqli_fetch_array($resultForm))
{
$set_id = $rij['start_set'];
}
//(start)sets
if (empty ($set_id)) {$Set[] = "<option SELECTED>n.v.t.</option>\n"; }
// de bestaande startsets uit database halen
$resultSet = mysqli_query($db,
"SELECT * FROM sets ORDER BY Naam") or die ("ophalen (start)sets is niet gelukt.<br />");
while ($set = mysqli_fetch_assoc($resultSet))
{
if ($set['id_set'] == $set_id)
{
$Set[] = "<option SELECTED value=\"".$set['id_set']."\">".$set['Naam']."</option>\n";
}
else
{
$Set[] = "<option value=\"".$set['id_set']."\">".$set['Naam']."</option>\n";
}
}
?>
<body>
<h2>Wijzig deze gegevens</h2>
<p><i>Record nr: <?php echo $_GET['id'] ?></i></p>
<form action="<?php echo($_SERVER["PHP_SELF"]);?>" method="post">
<input type="hidden" name="JA" value="1">
<input type="hidden" name="id" value="<?php echo($_GET['id']);?>">
<table width="100%">
<tr>
<td>(Start)set</td>
<td>
<select name="set"><?php foreach($Set AS $sets) echo $sets ?></select>
</td>
</tr>
</table>
<input type="Submit" value="Wijzigingen bijwerken">
<input type="Button" value="Nee, terug naar overzicht" onclick="javascript:self.close();">
</form>
<?php
//hier wordt else-blok af gesloten
}
?>
</body>
</html>
Ik heb hem getest en het werkt. In de tabel staat wel een 0, geen NULL.
En ik krijg een waarschuwing: Warning: Undefined variable $queryUpdate in C:\wamp\www\modellenEdit.php on line 23
regel 23:
echo "De SQL-query is: ".$queryUpdate;
Soms op de verkeerde plek in het script??? Eerder na uitvoering van de UPDATE, waar ook "or die("Wijzigen is niet gelukt.<br />" . mysqli_error($db) . "<br /> Query: " . $queryUpdate)" staat, zou ik denken.
[size=xsmall]Toevoeging op 28/10/2024 15:40:11:[/size]
ik heb
mysqli_real_escape_string($_POST['set']);
weggelaten, want hij produceerde een foutmelding: miste één van de twee benodigde argumenten.
Moest het soms
"Ik weet niet of het uitvoeren van de query lukt, maar ik zeg maar zelf even dat het lukt!"
Heel bijzonder, en zeer fout.... :-P
<?php
echo "De SQL-query is: ".$queryUpdate;
$queryUpdate =
"UPDATE
modellen
SET
start_set = '".$_POST['set']."'
WHERE
id=".$_POST['id'];
?>
Dit klopt ook niet. Of ben je helderziend? Want $queryUpdate is nog niet gedefinieerd, wat daaronder gebeurt, en daarvoor wil je al weten wat erin staat?
Over je mysqli_real_escape_string() vraag:
Heb je al op [php]mysqli_real_escape_string[/php] gekeken?
Dan kan je zien dat de opbouw als volgt is:
Dus: Eerst moet je inderdaad de connectie benoemen in het eerste argument, en in het tweede argument je string, wat ook uit $_POST kan komen. Hierbij kan ik me indenken dat het wel behoorlijk omvangrijk kan zijn met heel veel velden (databasenormalisatie zou een goed idee kunnen zijn als je dit wilt beperken). Maar je kan ook kiezen om 'prepared statements' te gebruiken.
Bovendien gaat het op deze plaats om integers, niet im strings.
Maar jij controleert helemaal niet of het ook een integer IS.
gebruik dan op z'n minst in plaats van $_POST['set'], filter_input(INPUT_POST, 'set', FILTER_VALIDATE_INT).
Wat nu als $_POST['set'] niet "12" bevat, maar zeg
"12' , id='0"
Dan verandert hij niet alleen de kolom set naar 12, maar ook id naar 0.
Maar het wordt spannender als er ipv values ook nog met subquery's gewerkt wordt.
Ik heb dat laatst mogen oplossen voor een bedrijf waar na een pen-test dezelfde aanname "het zijn altijd getallen" een lek veroorzaakte.
Bij de pen-test werd dan als subquery een SLEEP(4) gebruikt.
Dit was tevens het bewijs: als ik de beoogde input gebruik, dan ververst de pagina in 1 seconde, met de toevoeging duurt het 5: ergo het is gevoelig voor sql-injectie.
Maar denk je eens in wat er gebeurt als de subquery updates doet in andere tabellen, records verwijdert of hele tabellen dropt.