我在MySQL的某些列上创建了一个包含NOT NULL
约束的表。然后在PHP中,我写了一个脚本来插入数据,插入查询。当我在此插入语句中省略其中一个NOT NULL
列时,我希望MySQL发出错误消息,并且我希望我的脚本失败。相反,MySQL会在NOT NULL
字段中插入空字符串。在其他省略字段中,数据为NULL,这很好。有人能告诉我我在这里做错了什么吗?MySQL忽略NOT NULL约束
我使用这个表:
CREATE TABLE IF NOT EXISTS tblCustomers (
cust_id int(11) NOT NULL AUTO_INCREMENT,
custname varchar(50) NOT NULL,
company varchar(50),
phone varchar(50),
email varchar(50) NOT NULL,
country varchar(50) NOT NULL,
...
date_added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (cust_id)
) ;
而这个插入语句:
$sql = "INSERT INTO tblCustomers (custname,company)
VALUES ('".$customerName."','".$_POST["CustomerCompany"]."')";
$res = mysqli_query($mysqli, $sql);
或者使用绑定变量:
$stmt = mysqli_prepare($mysqli, "INSERT INTO tblCustomers (custname,company, email, country) VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'ssss', $customerName, $_POST["CustomerCompany"], $_POST["CustomerEmail"], $_POST["AddressCountry"]);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
严格模式做到了!谢谢!至少当我省略一个值时,记录没有被插入。当$ _POST [“CustomerEmail”]为空时,该记录仍然插入,并且为空字符串,但这不是该问题的范围。阻止插入空字符串的搜索继续进行。 – Whakkee 2010-03-24 19:58:52
为了回答你的第二个问题,你应该使用参数绑定,正如其他答案中所解释的,但考虑一下。你不需要'。' concat操作符在使用双引号时生成查询。您可以执行此操作“VALUES($ customerEmail)”。因此:if(!empty($ _ POST ['CustomerEmail']){$ customerEmail =''$ _POST ['CustomerEmail']'“;} else {$ customerEmail =”NULL“;} – 2010-03-24 20:29:12
感谢您的建议,我已经使用参数绑定,当马克Byers发布它时,我改变了我的代码,并且...我已经做了检查在PHP方面是否是空的我正在寻找一个数据库检查,就像我用于Oracle数据库的检查约束。说实话:在Oracle中我不需要检查约束,因为在Oracle中空字符串被视为NULL。在这种情况下,空字符串与NULL一样不好,所以当我仍然可以插入空字符串,NOT NULL约束对我来说毫无用处,也许我应该发布一个关于这个的新问题。 – Whakkee 2010-03-25 08:40:10