我在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