簡體   English   中英

配置相同,但帶來的是:錯誤SQLSTATE [23000]列不能為null

[英]Same configuration but one brings: Error SQLSTATE[23000] column cannot be null

我知道已經有很多關於此錯誤的帖子,而且我確實知道如何以及為什么發生。 我的問題是,我使用相同的配置,並且運行的代碼幾乎相同,但是在發送表單后,只有一頁會出現錯誤。 數據庫中的相應列具有完全相同的配置:Null關閉(因此實際上兩者都必須響應一個錯誤),並且類型均為varchar,兩者都自動遞增。 我不知道,如果這真的有助於將代碼片段發布到這里,我只是希望有人知道/已經出現了與此錯誤類似的情況。

現在,這里是插入命令和表單的第一個代碼,發送后不會出錯。 我有一個用於選擇subject2的下拉按鈕,也可以保持不變(我縮短了表格):

<form name="lfb" action="lfb.php#lfbjump" method="post">

<select name="subject2">
<option value="">choose another subject</option>
<?php foreach ($subjects->fetchAll() as $subject): ?>
  <option value="<?php echo $subject['fach_id']; ?>"><?php echo $subject['subject']; ?></option>
<?php endforeach; ?>
</select>

</form>

相應的插入命令(已縮短):

$order =  "
INSERT INTO $dbname.$tablename (

subject2)

VALUES (

:subject2)";

try {
$pdo = new PDO($dsn, $user, $pw);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}

$statement = $pdo->prepare($order);

$statement->bindParam(':subject2', $subject2);


$subject2 = $_POST['subject2'];

$statement->execute();

現在,另一個下拉列表是通過ajax加載的(這有區別嗎?),並且會帶來錯誤:

<select name="noteniveau1">
  <option value="">please choose</option>
  <option value="1">example 1</option>
  <option value="2">example 2</option>
</select>

插入命令(在循環中-> $ nr從1到4):

$order =  "
INSERT INTO $dbname.$tablename (

noteniveau)

VALUES (

:noteniveau)";


try {
$pdo = new PDO($dsn, $user, $pw);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}

$statement = $pdo->prepare($order);


$statement->bindParam(':noteniveau', $noteniveau);

$noteniveau = $_POST["noteniveau$nr"];

$statement->execute();

錯誤:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]:
Integrity constraint violation: 1048 Column 'noteniveau' cannot be null' in /var/www/xx/html/xx/xx.php:199 
Stack trace: #0 /var/www/xx/html/xx/xx.php(199): PDOStatement->execute() 
#1 /var/www/xx/html/xx/xx.php(438): include('/var/www/xx...') #2 {main} thrown in /var/www/xx/html/xx/xx.php on line 199

在兩個插入中,在分配變量之前都使用了變量。 僅僅因為您在第一個插入操作中沒有出現錯誤,並不意味着您實際上最終成功插入了。 你應該有:

$statement = $pdo->prepare($order);
$subject2 = $_POST['subject2'];
$statement->bindParam(':subject2', $subject2);
$statement->execute();

對於第二個插入:

$statement = $pdo->prepare($order);
$noteniveau = $_POST["noteniveau$nr"];
$statement->bindParam(':noteniveau', $noteniveau);
$statement->execute();

請注意,分配已移至使用前。

當提交的數據與預期的不符時,您還應該進行適當的錯誤處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM