sql >> Database >  >> RDS >> Mysql

Debug PDO mySql voeg NULL in de database in in plaats van leeg

Dit lijkt mij een (niet gerapporteerde?) bug in PDO's voorbereide emulatie van verklaringen:

  1. de implementatie van PDOStatement::execute() uiteindelijk roept pdo_parse_params() op ;

  2. dat op zijn beurt probeert om waarden aan te halen/te ontsnappen gebaseerd op het gegevenstype van de relevante parameter (zoals aangegeven door de $data_type argumenten voor PDOStatement::bindValue() en PDOStatement::bindParam() —alle parameters geleverd als $input_parameters naar PDOStatement::execute() worden behandeld als PDO::PARAM_STR , zoals vermeld in de documentatie van die functie);

  3. string-getypte waarden worden escaped/geciteerd door aanroepen quoter() methode, ongeacht of ze null . zijn :in het geval van PDO_MySQL is dat mysql_handle_quoter() , die (uiteindelijk) de waarde doorgeeft aan mysqlnd_cset_escape_quotes() of mysql_cset_escape_slashes() , afhankelijk van de NO_BACKSLASH_ESCAPES van de server SQL-modus;

  4. gegeven een null argument, geven beide functies een lege string terug.

Mijn mening is dat, voorafgaand aan het inschakelen van de parameter typ (in stap 2 hierboven), pdo_parse_params() moet het type instellen op PDO::PARAM_NULL als de waarde null . is . Sommigen zouden echter kunnen beweren dat dit typespecifieke verwerking van null . zou voorkomen waarden waar van toepassing, in welk geval de string case (in stap 3 hierboven) moet zeker null verwerken waarden voordat u doorgaat met een oproep naar de quoter() van de bestuurder methode.

Als tijdelijke oplossing is het meestal toch het beste om de emulatie van voorbereide verklaringen uit te schakelen:

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);



  1. SQL-query om de meest recente rij te krijgen voor elke instantie van een bepaalde sleutel

  2. Hoe voeg ik een byte [] in een SQL Server VARBINARY-kolom in?

  3. Wanneer moet ik PL/SQL BEGIN...END-blokken nesten?

  4. Hoe de som van meerdere kolommen in een tabel in SQL Server 2005 te vinden?