我正在使用预准备语句将一些值插入到我的表中。在这之前,我正在验证字段。某些字段为空,因此需要保持为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而不是空白字段...
提前致谢
答案 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']);
}
这里的教训:永远不要让系统决定变量的值应该是什么......哦,好吧!