sql >> Databáze >  >> RDS >> Mysql

Ladit PDO mySql vložit NULL do databáze místo prázdné

Zdá se mi, že jde o (nenahlášenou?) chybu v emulaci připraveného příkazu PDO:

  1. implementace z PDOStatement::execute() případně vyvolá pdo_parse_params() ;

  2. že se na oplátku pokouší citovat/uniknout hodnoty na základě datového typu příslušného parametru (jak je označeno $data_type argumenty pro PDOStatement::bindValue() a PDOStatement::bindParam() —všechny parametry poskytnuty jako $input_parameters na PDOStatement::execute() jsou považovány za PDO::PARAM_STR , jak je uvedeno v dokumentaci k této funkci);

  3. hodnoty typu string jsou uvozeny/uvozeny voláním příslušný databázový ovladač quoter() bez ohledu na to, zda jsou null :v případě PDO_MySQL je to mysql_handle_quoter() , který (nakonec) předá hodnotu buď mysqlnd_cset_escape_quotes() nebo mysql_cset_escape_slashes() , v závislosti na serveru NO_BACKSLASH_ESCAPES režim SQL;

  4. má hodnotu null argument, obě tyto funkce vrátí prázdný řetězec.

Můj názor je, že před přepnutím parametru typ (v kroku 2 výše), pdo_parse_params() by měl nastavit typ na PDO::PARAM_NULL pokud je hodnota null . Někteří by však mohli namítnout, že to zabrání typově specifickému zacházení s null hodnoty, kde je to vhodné, v takovém případě případ řetězce (v kroku 3 výše) by rozhodně měl zpracovávat null hodnoty před pokračováním ve volání ovladače quoter() metoda.

Jako dočasné řešení je obvykle nejlepší zakázat emulaci připraveného příkazu:

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



  1. Jak mohu sečíst sloupce ve více tabulkách v MySQL?

  2. Jaká je nejlepší struktura databáze pro uchování vícejazyčných dat?

  3. php mysql fulltextové vyhledávání:lucene, sfinga nebo?

  4. Jak vytvořit databázi zásob v aplikaci Microsoft Access