准备语句和占位符值没有设置... null或空白字段?

时间:2011-09-02 08:41:59

标签: php prepared-statement

我正在使用预准备语句将一些值插入到我的表中。在这之前,我正在验证字段。某些字段为空,因此需要保持为NULL。

出于某种原因,在我的本地开发环境中,当字段未初始化时,数据库中的字段保持为空...但是,在我的实时开发中,当字段未初始化时,数据库中的字段更改当它是一个varchar时为空白,当它是一个int时为0。

为什么?如果表单中没有输入值,我想保持NULL!

这就是mysql的样子:

CREATE TABLE album (
   album_id smallint unsigned not null auto_increment,
   title varchar(75) not null,
   subtitle varchar(75),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

我的php脚本验证数据:

// validation
$warning = array();

// validate title (required)
$title = trim($_POST['title']);

if ($title == '') {
   $warning['title'] = 'The title is a required field';
}

// validate subtitle if exists (optional)
if (trim($_POST['subtitle']) != '') {
   $subtitle = trim($_POST['subtitle']);
}

我的PHP脚本,如果验证通过!

if (!warning) {
   $sql = 'INSERT INTO album (title, subtitle, created) VALUES(?, ?, NOW())';
   $stmt->prepare($sql);
   $stmt->bind_param('ss', $title, $subtitle);
   $stmt->execute();
   $stmt->free_result();

   if ($stmt->affected_rows > 0)
      echo 'Success!';
   else
      echo 'Failed!';
}

如果字幕没有值(甚至没有设置!),字段是否应该保持为NULL(如数据库中所定义)而不是空字段?

这就是我在本地环境中设计模型时的想法。但是,一旦在我的现场,反应就完全相反了?

帮助!我如何使它保持为NULL而不是空白字段...

提前致谢

2 个答案:

答案 0 :(得分:1)

您的数据库框架是什么?两个系统具有相同的版本?

似乎您的PDO bind_params在您的某个系统中与PDO :: bindValue与PDO :: PARAM_NULL data_type无法正常工作。

http://php.net/manual/en/pdostatement.bindvalue.php

编辑 - 1 -

Ops,你的SQL语句似乎错了:

 INSERT INTO album (title, subtitle, created) VALUES(?, ?, ?, NOW())';

三个字段的四个值。

编辑 - 2 -

我说你做了:

 $stmt = $mysqliConn->prepare($sql);
 $stmt->bind_param('ss', $value1, $value2);

以前

 $value2 = null;

如果为null。在您的代码中,您没有分配任何值,请尝试强制指定null。

答案 1 :(得分:0)

我猜我必须在验证码中明确声明$ subtitle NULL才能正常工作......很奇怪!

if (trim($_POST['subtitle']) == '') {
  $subtitle = NULL;

} else {
  $subtitle = trim($_POST['subtitle']);
}

这里的教训:永远不要让系统决定变量的值应该是什么......哦,好吧!