Mysqli_error()

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 volgende »

Guus Wiegerinck

Guus Wiegerinck

22/10/2024 15:44:33
Quote Anchor link
Ja, dat ging prima. De oranje waarschuwingen en errors waren weg. Dank je wel.

Blijft nog wel werk aan de winkel. Update lukt soms nog niet omdat sommige waardes niet passen bij de collatie van betreffende veld.
 
PHP hulp

PHP hulp

30/01/2025 23:46:32
 
Ozzie PHP

Ozzie PHP

22/10/2024 16:06:45
Quote Anchor link
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.
 
- Ariën  -
Beheerder

- Ariën -

22/10/2024 20:43:28
Quote Anchor link
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?
 
Guus Wiegerinck

Guus Wiegerinck

23/10/2024 16:20:12
Quote Anchor link
Vanmorgen lag ik me af te vragen wat die mysqli_error($db)[/db] nou eigenlijk doet. Hij staat er immers nadat de query is uitgevoerd. En ineens had ik een helder moment: Aha, die functie geeft aan waar de kink in de kabel zit. Zoals "Wijzigen is niet gelukt.
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if (empty ($set_id)) {$Set[] = "<option SELECTED value=\"\">n.v.t.</option>\n";   }

De paginabron laat het volgende resultaat zien van deze regel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<select name="set"><option SELECTED value="">n.v.t.</option>

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
 
Ozzie PHP

Ozzie PHP

23/10/2024 17:09:05
Quote Anchor link
Hoe voeg je NULL toe aan de database? Kun je de code tonen?
 
Adoptive Solution

Adoptive Solution

23/10/2024 17:25:17
 
Guus Wiegerinck

Guus Wiegerinck

23/10/2024 17:25:31
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if (empty ($set_id)) {$Set[] = "<option SELECTED value=\"\">n.v.t.</option>\n";   }


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.
 
Ozzie PHP

Ozzie PHP

23/10/2024 17:54:59
Quote Anchor link
De regel code die jij toont, voegt niet iets toe aan de database. Dat heeft te maken met het tonen van een drop down box.

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.)
 
Guus Wiegerinck

Guus Wiegerinck

23/10/2024 18:57:32
Quote Anchor link
[/quote]
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<option SELECTED value=\"\NULL\">n.v.t.</option>\n

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.
 
- Ariën  -
Beheerder

- Ariën -

23/10/2024 20:23:48
Quote Anchor link
Nee, dan wordt het als waarschijnlijk als string behandeld.
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)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}

?>


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 -
 
Guus Wiegerinck

Guus Wiegerinck

25/10/2024 16:45:38
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if (empty ($set_id)) {$Set[] = "<option SELECTED value=\"\">n.v.t.</option>\n"; }

Daarna volgt de UPDATE, met controle
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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']."'


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)
PHP script in nieuw venster Selecteer het PHP script
1
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

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)
PHP script in nieuw venster Selecteer het PHP script
1
$variabele_sql = empty($variabele) ? "NULL" : "'" . mysqli_real_escape_string($variabele) . "'";

een andere nieuwere manier van schrijven als
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
(if empty(variabele)){$variabele_sql="'" . mysqli_real_escape_string($variabele) . "'";}
????
Gewijzigd op 25/10/2024 16:47:54 door Guus Wiegerinck
 
- Ariën  -
Beheerder

- Ariën -

25/10/2024 18:36:07
Quote Anchor link
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.
Gewijzigd op 25/10/2024 18:37:48 door - Ariën -
 
Guus Wiegerinck

Guus Wiegerinck

25/10/2024 19:05:00
Quote Anchor link
- 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
 
- Ariën  -
Beheerder

- Ariën -

25/10/2024 19:10:42
Quote Anchor link
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.
Gewijzigd op 25/10/2024 19:11:28 door - Ariën -
 
Guus Wiegerinck

Guus Wiegerinck

25/10/2024 19:33:25
Quote Anchor link
NULL gebruiken?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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"

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$startset = null;
    if (empty ($set_id)) {$Set[] = "<option SELECTED value=\"".$startset."\">n.v.t.</option>\n"; }

Paginabron zegt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<option SELECTED value="">n.v.t.</option>

Werkt ook niet.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$startset = 0;
    if (empty ($set_id)) {$Set[] = "<option SELECTED value=\"".$startset."\">n.v.t.</option>\n"; }

Paginabron zegt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<option SELECTED value="0">n.v.t.</option>

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
 
- Ariën  -
Beheerder

- Ariën -

25/10/2024 20:37:00
Quote Anchor link
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.
 
Guus Wiegerinck

Guus Wiegerinck

26/10/2024 12:56:19
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if (!EMPTY ($_POST['set'])){$_POST['set'] = (int)$_POST['set'];}


de waarde in de selectie optionregel heb ik 0 gegeven.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if (empty ($set_id)) {$Set[] = "<option SELECTED value=\"0\">n.v.t.</option>\n"; }

de waarde 'leeg' (value=\"\") laten werkt niet.
Gewijzigd op 26/10/2024 14:31:31 door Guus Wiegerinck
 
Ozzie PHP

Ozzie PHP

26/10/2024 17:47:08
Quote Anchor link
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
 
- Ariën  -
Beheerder

- Ariën -

26/10/2024 19:28:46
Quote Anchor link
Schoonheidstipje: Gebruik andere single-quotes om je string om het escapen met \ tegen te gaan.
Double-quotes bij HTML zijn gewoonlijk.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if (empty ($set_id)) {
    $Set[] = '<option SELECTED value="0">n.v.t.</option>\n';
}

?>


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...

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 -
 
Guus Wiegerinck

Guus Wiegerinck

26/10/2024 21:00:27
Quote Anchor link
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?
Gewijzigd op 26/10/2024 22:13:14 door Guus Wiegerinck
 

Pagina: « vorige 1 2 3 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.