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.

Hieronder een deel van het script regel 6 t/m 44.

 "{ //query samenstellen
	$queryUpdate =
        "UPDATE
            modellen
        SET
            merk = '".$_POST['merk']."',
            artikelnummer = '".$_POST['artikel']."',
            maatschappij = '".$_POST['maatschappij']."',
            soort = '".$_POST['soort']."',
            bedrijf = '".$_POST['bedrijf']."',
            reeks = '".$_POST['reeks']."',
            klasse = '".$_POST['klasse']."',
            asindeling = '".$_POST['asindeling']."',
            lengte = '".$_POST['lengte']."',
            interieur = '".$_POST['interieur']."',
            verlichting = '".$_POST['verlichting']."',
            tijdperk = '".$_POST['tijdperk']."',
            aantal = '".$_POST['aantal']."',
            railsysteem = '".$_POST['railsysteem']."',
            stroomsoort = '".$_POST['stroomsoort']."',
            wielmerk = '".$_POST['wielmerk']."',
            wieldiameter = '".$_POST['wieldiameter']."',
            wielaslengte = '".$_POST['wielaslengte']."',
            motor = '".$_POST['motor']."',
            gemotoriseerd = '".$_POST['gemotoriseerd']."',
            decoder = '".$_POST['decoder']."',
            protocol = '".$_POST['protocol']."',
            adres = '".$_POST['adres']."',
            consist_adres = '".$_POST['consistadres']."',
            bijzonderheden = '".$_POST['bijzonder']."',
            extra_informatie = '".$_POST['extra']."',
            modelinfo = '".$_POST['modelinfo']."',
            categorie = '".$_POST['categorie']."',
            afbeelding = '".$_POST['afbeelding']."',
            OVP = '".$_POST['ovp']."',
            start_set = '".$_POST['set']."'
        WHERE
            id=".$_POST['id'];
	$resultEdit = mysqli_query($db, $queryUpdate) or die("Wijzigen is niet gelukt.<br />" . mysqli_error() . "<br /> Query: " . $queryUpdate);


Is de variabele $queryUpdate leeg? Is de syntaxis van mysqli_query verkeerd?
$db is niet leeg, daar kreeg ik geen error van.
Ja, normaal sorteer ik op naam zodat ik een mooie alfabetische lijst krijg. Met sorteren op Id wordt het op den duur chaotischer door toevoegen of verwijderen van records. Id gebruik ik eigenlijk alleen voor het koppelen van tabellen, maar ik weet niet of een Idnr als string problemen kan opleveren bij het koppelen. Daarom heb het type van het veld waarmee ik aan het stoeien ben, terug veranderd is INT.

Om ervoor zorgen dat UPDATE niet weer problemen oplevert, heb ik het script aangevuld met een stuk van jouw code. Het ziet er nu zó uit:

Eerst heb ik de waarde van het veld opgehaald uit de database en opgeslagen in $set_id.
Met een selectieformulier ga ik deze waarde weer ongewijzigd opsturen naar de UPDATE-query: $_POST['set'] .

De selectieregel ziet er zó uit:

if (empty ($set_id)) {$Set[] = "<option SELECTED value=\"\">n.v.t.</option>\n"; }

Daarna volgt de UPDATE, met controle

//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']."'


Helaas, toch weer fout.
Mysqli_error($db) rapporteert: Wijzigen is niet gelukt. Incorrect integer value: '' for column 'start_set' at row 1

Kijk ik in phpMyAdmin dan zie bij betreffende model in veld "startset" een 0 staan. Wil ik die wissen, krijg ik dezelfde foutmelding.

Fout

SQL-query: Kopiëren Wijzigen Wijzigen

UPDATE `modellen` SET `start_set` = '' WHERE `modellen`.`id` = 202

MySQL meldt: Documentatie
#1366 - Incorrect integer value: '' for column 'start_set' at row 1

Wat heb ik niet goed gedaan??? En eigenlijk zou ik die 0 in de tabel graag weg willen hebben en vervangen door NULL. Ik heb er een hard hoofd in of dat wel lukt.

(bij sommige andere modellen staat ook een 0 en bij vele andere NULL Geen idee hoe dat zo gekomen is. Eerder een UPDATE gedaan die toen geen probleem opleverde??? Toen onder Wamp 2.5 met Mysql 5.5.17 en Php 5.5.12)
===========================
Nog een vraag: is de code
$variabele_sql = empty($variabele) ? "NULL" : "'" . mysqli_real_escape_string($variabele) . "'";

een andere nieuwere manier van schrijven als
(if empty(variabele)){$variabele_sql="'" . mysqli_real_escape_string($variabele) . "'";}
????
Met de juiste instellingen kan je ook een NULL waarde invoegen als INT. Hoe zien de eigenschappen van je tabel eruit?

Het antwoord op je andere vraag: Je kan die verkorte short-hand notatie ook opschrijven als een if-else statement. Zo'n verkorte code heet de ternary operator.
- Ariën - op 25/10/2024 18:36:07

Met de juiste instellingen kan je ook een NULL waarde invoegen als INT. Hoe zien de eigenschappen van je tabel eruit?


Ik weet niet precies wat je bedoelt, hier geef ik maar wat ik zie. Kun je aangeven of je dit bedoelt/
  • [li]* (=id) 32[/li]
    [li]naam: Startset[/li]
    [li]type: INT(100)/li]
    [li]collatie: leeg[/li]
    [li]attributen: leeg[/li]
    [li]leeg: ja[/li]
    [li]standaardwaarde: NULL[/li]
    [li]opmerkingen: leeg[/li]
    [li]extra: leeg[/li]
    [li]actie: 3 opties
    [list]
    [li]veranderen[/li]
    [li]verwijderen[/li]
    [li]Meer:
    [list]
    [li]primaire sleutel[/li]
    [li]unieke waarde[/li]
    [li]index[/li]
    [li]ruimtelijk[/li]
    [li]volledige tekst[/li]
    [li]verschillende waarden[/li]
    [/li]

[/li]
Je kan dan gewoon een NULL gebruiken. Maar die error die je kreeg krijg je omdat je een lege waarde invult. Je kan in MySQL ook doortellen met 'auto increment'. Dan krijgt elk record een oplopend nummer.
NULL gebruiken?
if (empty ($set_id)) {$Set[] = "<option SELECTED value=\"NULL\">n.v.t.</option>\n"; }

Dit werkt niet. "Incorrect integer value: '' for column 'start_set' at row 1"

if (empty ($set_id)) {$Set[] = "<option SELECTED value=\"0\">n.v.t.</option>\n"; }

Werkt ook niet.

Ik heb is_string() losgelaten op $_POST['set']. Boolean ofwel: het is een string. Het zou een integer moeten zijn.

$startset = null;
    if (empty ($set_id)) {$Set[] = "<option SELECTED value=\"".$startset."\">n.v.t.</option>\n"; }

Paginabron zegt:
 <option SELECTED value="">n.v.t.</option>

Werkt ook niet.

$startset = 0;
    if (empty ($set_id)) {$Set[] = "<option SELECTED value=\"".$startset."\">n.v.t.</option>\n"; }

Paginabron zegt:
 <option SELECTED value="0">n.v.t.</option>

Werkt ook niet.


[size=xsmall]Toevoeging op 25/10/2024 19:34:20:[/size]

- Ariën - op 25/10/2024 19:10:42

Je kan in MySQL ook doortellen met 'auto increment'. Dan krijgt elk record een oplopend nummer.

Gebeurt al. Maar de namen blijven niet persé alfabetisch

Kijk eerst eens wat je query-string doet, door die te echo'en. Ik vermoed dat je 'NULL' invoert, wat een string is, en dus geen NULL. Sowieso hoort dat niet in je HTML, want dan kan iedereen met wat creativiteit zijn eigen meuk invoeren.
Ik heb een ander trucje gevonden en toegepast, nl (int)$_POST['set']. En dat werkt, mits de sleutel 'set' niet leeg is.
De toegevoegde regel luidt:
if (!EMPTY ($_POST['set'])){$_POST['set'] = (int)$_POST['set'];}


de waarde in de selectie optionregel heb ik 0 gegeven.
if (empty ($set_id)) {$Set[] = "<option SELECTED value=\"0\">n.v.t.</option>\n"; }

de waarde 'leeg' (value=\"\") laten werkt niet.
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
Schoonheidstipje: Gebruik andere single-quotes om je string om het escapen met \ tegen te gaan.
Double-quotes bij HTML zijn gewoonlijk.

<?php
if (empty ($set_id)) {
$Set[] = '<option SELECTED value="0">n.v.t.</option>\n';
}
?>

[size=xsmall]Toevoeging op 26/10/2024 19:29:51:[/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.

etc...

Vandaar mijn tip om je query-string even te echo'en voordat je het uitvoert. Dan weet je precies welke query er aan MySQL gevoerd wordt. Als het inderdaad 'NULL' is, dan weten we dat het niet klopt.
Hoe doe je dat, de query-string echoën? Internet gaf mij geen handvatten.

In mijn reactie dd 25 okt zie je dat ik daar NULL heb gebruikt. Tussen \" weliswaar, en dat werkte niet. NULL was dus toch een string. Die \" (geëscapte ") horen daar, toch?

Reageren