Mysqli_error()
Pagina: « vorige 1 2 3 volgende »
Blijft nog wel werk aan de winkel. Update lukt soms nog niet omdat sommige waardes niet passen bij de collatie van betreffende veld.
Guus Wiegerinck op 22/10/2024 15:44:33:
Ja, dat ging prima. De oranje waarschuwingen en errors waren weg. Dank je wel.
Graag gedaan.
Guus Wiegerinck op 22/10/2024 15:44:33:
Blijft nog wel werk aan de winkel. Update lukt soms nog niet omdat sommige waardes niet passen bij de collatie van betreffende veld.
Lukt de update-query zelf niet, of wordt de data verkeerd geüpdatet?
Incorrect integer value: '' for column 'start_set' at row 1". Onder PHP5 kreeg ik dat soort diagnoses ook, maar zonder voorafgaand oranje error/waarschuwing. In mijn herinnering waren die echter niet zó to the point, je moest het verder zelf uitzoeken waar het probleem zat. Nu begreep ik het. :) :)
Je vraagt of de update zélf niet lukt. Nee, ik word voorlopig getracteerd op enkele foutjes in het script, die ik vervolgens stuk voor stuk mag repareren.
Eén ervan is deze: Ik wil de waarde NULL toekennen aan een veld. Dat veld mag leeg zijn,standaardwaarde is NULL maar toch meldt mysqli_error($db) dat er sprake is van een incorrect integer value.
Concreet gaat het hier om de vraag of een bepaalde modellocomotief deel uitmaakt van een startset. Er zijn vier startsets, maar deze loc maakt van geen enkele deel uit. Dus de waarde die ik moet invullen luidt dus: "Geen van die vier". ofwel: NULL.
Code in mijn script is als volgt:
De paginabron laat het volgende resultaat zien van deze regel:
Toelichting.
Bij het openen van de edit-pagina is $set_id leeg, want toen ik de loc invoerde heb ik het veld 'startset' leeg gelaten. Ik wil dat zo houden, en ga dus verder met wijzigen en niet-wijzigen van de data. Maar dan lukt de UPDATE niet.
Blijkbaar is NULL niet toegestaan. Ik vind op https://www.w3schools.com/mysql/mysql_datatypes.asp: "BOOL Zero is considered as false, nonzero values are considered as true." Hoe los ik dit op?
Eén mogelijkheid is: voeg een vijfde startset toe: "geen" of "neen" geheten, met id=5. Maar misschien zijn er nog leukere, elegantere oplossingen te bedenken.
Gewijzigd op 23/10/2024 16:26:40 door Guus Wiegerinck
Hoe voeg je NULL toe aan de database? Kun je de code tonen?
Ozzie PHP op 23/10/2024 17:09:05:
Hoe voeg je NULL toe aan de database? Kun je de code tonen?
Zie de 1e code:
Niet dat dat lukt ... dan was dat geen probleem ...
Het veld is leeg ofwel niks ingevuld bij de INSERT. En wil het leeg houden bij een update. Dat is de vraag.
Ik vermoed dat je een lege string probeert toe te voegen aan het databaseveld. In plaats daarvan moet je NULL toevoegen. (Een lege string is een ander datatype dan NULL.)
Zeker, dat is een drop down box. Maar als je dan 'submit', dan is de waarde die verstuurd wordt "" ofwel "niets" ofwel NULL of een lege string
Quote:
Ik vermoed dat je een lege string probeert toe te voegen aan het databaseveld. In plaats daarvan moet je NULL toevoegen. (Een lege string is een ander datatype dan NULL.)
Ik heb het geprobeerd met NULL als waarde.
Werkt niet. NULL is geen correcte integer. Misschien moet ik het anders schrijven, zó kan het ook string zijn.
Ik had nog een ander idee gekregen: het type van het veld veranderen van INTEGER in VARCHAR.
En dat werkt. De UPDATE is geslaagd.
Het ligt eraan hoe je query in elkaar steekt. Daar zien we helaas niks van.
Maar dan komt het neer op zo'n opzet.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// Variabele die je wilt gebruiken in de query
$variabele = ''; // 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) . "'";
// Bouw de query
$query = "INSERT INTO tabelnaam (kolomnaam) VALUES ($variabele_sql)";
// Voer de query uit
if (mysqli_query($query) === TRUE) {
echo "Gegevens succesvol ingevoegd";
} else {
echo "Fout: " . $mysqli->error;
}
?>
// Variabele die je wilt gebruiken in de query
$variabele = ''; // 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) . "'";
// Bouw de query
$query = "INSERT INTO tabelnaam (kolomnaam) VALUES ($variabele_sql)";
// Voer de query uit
if (mysqli_query($query) === TRUE) {
echo "Gegevens succesvol ingevoegd";
} else {
echo "Fout: " . $mysqli->error;
}
?>
Je kan van een INT veld wel een VARCHAR maken. Maar dan kan je er niet meer handig op sorteren, omdat het als een string (text) wordt behandeld. Ik zou het niet aanraden!
Gewijzigd op 23/10/2024 20:25:48 door - Ariën -
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:
Daarna volgt de UPDATE, met controle
Code (php)
1
2
3
4
5
6
2
3
4
5
6
//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']."'
$_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.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
Fout
SQL-query: Kopiren 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
SQL-query: Kopiren 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
Code (php)
1
$variabele_sql = empty($variabele) ? "NULL" : "'" . mysqli_real_escape_string($variabele) . "'";
een andere nieuwere manier van schrijven als
Code (php)
1
(if empty(variabele)){$variabele_sql="'" . mysqli_real_escape_string($variabele) . "'";}
Gewijzigd op 25/10/2024 16:47:54 door Guus Wiegerinck
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.
Gewijzigd op 25/10/2024 18:37:48 door - Ariën -
- 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/
- * (=id) 32
- naam: Startset
- type: INT(100)/li]
- collatie: leeg
- attributen: leeg
- leeg: ja
- standaardwaarde: NULL
- opmerkingen: leeg
- extra: leeg
- actie: 3 opties
- veranderen
- verwijderen
- Meer:
- primaire sleutel
- unieke waarde
- index
- ruimtelijk
- volledige tekst
- verschillende waarden
Gewijzigd op 25/10/2024 19:05:51 door Guus Wiegerinck
Gewijzigd op 25/10/2024 19:11:28 door - Ariën -
Dit werkt niet. "Incorrect integer value: '' for column 'start_set' at row 1"
Werkt ook niet.
Ik heb is_string() losgelaten op $_POST['set']. Boolean ofwel: het is een string. Het zou een integer moeten zijn.
Code (php)
1
2
2
$startset = null;
if (empty ($set_id)) {$Set[] = "<option SELECTED value=\"".$startset."\">n.v.t.</option>\n"; }
if (empty ($set_id)) {$Set[] = "<option SELECTED value=\"".$startset."\">n.v.t.</option>\n"; }
Paginabron zegt:
Werkt ook niet.
Code (php)
1
2
2
$startset = 0;
if (empty ($set_id)) {$Set[] = "<option SELECTED value=\"".$startset."\">n.v.t.</option>\n"; }
if (empty ($set_id)) {$Set[] = "<option SELECTED value=\"".$startset."\">n.v.t.</option>\n"; }
Paginabron zegt:
Werkt ook niet.
Toevoeging op 25/10/2024 19:34:20:
- 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.
De toegevoegde regel luidt:
de waarde in de selectie optionregel heb ik 0 gegeven.
de waarde 'leeg' (value=\"\") laten werkt niet.
Gewijzigd op 26/10/2024 14:31:31 door Guus Wiegerinck
'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
Double-quotes bij HTML zijn gewoonlijk.
Code (php)
Toevoeging op 26/10/2024 19:29:51:
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...
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.
Gewijzigd op 26/10/2024 19:30:24 door - Ariën -
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?
Gewijzigd op 26/10/2024 22:13:14 door Guus Wiegerinck