Mysql
 sql >> база данни >  >> RDS >> Mysql

Отстраняване на грешки в PDO mySql вмъкнете NULL в базата данни вместо празно

Струва ми се, че това е (недокладван?) бъг в емулацията на подготвеното изявление на PDO:

  1. имплементацията на PDOStatement::execute() в крайна сметка извиква pdo_parse_params() ;

  2. че от своя страна се опитва да цитира/избяга стойности въз основа на типа данни на съответния параметър (както е посочено от $data_type аргументи към PDOStatement::bindValue() и PDOStatement::bindParam() —всички параметри, предоставени като $input_parameters към PDOStatement::execute() се третират като PDO::PARAM_STR , както е посочено в документацията на тази функция);

  3. стойностите, въведени в низ са екранирани/в кавички от извикване quoter()<на съответния драйвер на базата данни /код> метод, независимо дали са null :в случая на PDO_MySQL, това е mysql_handle_quoter() , което (в крайна сметка) предава стойността на mysqlnd_cset_escape_quotes() или mysql_cset_escape_slashes() , в зависимост от NO_BACKSLASH_ESCAPES на сървъра SQL режим;

  4. дадено null аргумент, и двете функции връщат празен низ.

Моето мнение е, че преди превключването на параметъра тип (в стъпка 2 по-горе), pdo_parse_params() трябва да зададе типа на PDO::PARAM_NULL ако стойността е null . Някои обаче биха могли да твърдят, че това би предотвратило специфично за типа обработка на null стойности, където е уместно, в който случай редов случай (в стъпка 3 по-горе) определено трябва да обработва null стойности, преди да продължите с извикване на quoter() на драйвера метод.

Като междинно решение, деактивирането на емулация на подготвени оператори обикновено е най-доброто:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ИЗБЕРЕТЕ ИД ИМАТЕ максимален брой идентификатори

  2. Изберете отделни редове от две таблици, подредени по дата

  3. MySQL:Групиране по две колони и сумиране

  4. Разлика в производителността на Native SQL (използвайки MySQL) спрямо използването на Hibernate ORM?

  5. mysql:как да запазя ORDER BY след LEFT JOIN без пренареждане?