[英]Using PHP/PDO to set a NULL value
我正在嘗試使用PHP / PDO將一個名為“ flt_status”的MySQL(mysql-5.0.96)變量設置為默認值“ NULL”,並將其定義為INT(5)(可為空)。
在StackOverFlow(11692773,1391777)上有很多線程可以解決這個問題,但是似乎沒有一個對我有用。
我的代碼(非常簡短)如下所示;
$vs = “:ip, flt_status, sunrise”;
$match = array(
‘:ip’=>”$ip”,
‘:flt_status’=>”null, PDO::PARAM_INT”,
’:sunrise’=>”$sunrise”
);
$vars = “ip, flt_status, sunrise”;
$sql = "INSERT INTO skeds ( $vars ) VALUES ( $vs )";
$query = $db_found->prepare( $sql );
$query->execute( $match );
我已經嘗試了上述討論中概述的許多技術以及使用Google發現的其他技術,但是每當flt_status的值顯示為零(0)時。 我試過同時使用PDO :: PARAM_NULL和PDO :: PARAM_INT。
我在此示例中包括了IP和SUNRISE變量,因此我可以更好地理解經驗豐富的PHP / PDO程序員給我的任何示例。
有人可以告訴我我在做什么錯嗎?
在此先感謝您提供的任何幫助。
您做錯了幾件事。
$vs = “:ip, flt_status, sunrise”;
首先,您顯然在使用智能引號而不是直引號。 代碼需要直接引號。
接下來,您在ip
前面放置一個:
前綴,但是在其他兩個命名參數之前錯過了該前綴。 您需要一個:
在每個之前。
$match = array(
‘:ip’=>”$ip”,
‘:flt_status’=>”null, PDO::PARAM_INT”,
’:sunrise’=>”$sunrise”
);
接下來,將null
放在帶引號的字符串中。 這使其成為包含單詞'null'
的字符串文字,而不是真正的null。 這兩個概念是不同的,例如雞肉和一張紙上寫着“雞肉”一詞的區別。
另外,您不需要在變量周圍加上引號。
同樣,值得的是,數組的數組鍵上的:
前綴是可選的。 在早期版本的PDO中,它們是強制性的,但現在不是強制性的。 保留冒號前綴沒有什么害處,我只是想告訴您,因為它可以使將來更容易從另一個關聯數組(如$ _POST)中准備參數數組。
$vars = “ip, flt_status, sunrise”;
除了可以繼續使用智能引號之外,這還不錯。
$sql = "INSERT INTO skeds ( $vars ) VALUES ( $vs )";
在這里,您將遇到$vs
麻煩,因為它只包含一個參數占位符,后跟兩個普通列名。 在VALUES子句中傳遞列名在SQL中不是非法的,但是這樣做是沒有意義的。
$query = $db_found->prepare( $sql );
$query->execute( $match );
好的,除了不檢查錯誤。 除非您已啟用PDO的引發異常的屬性,否則您需要檢查prepare()
和execute()
的返回狀態,因為如果有任何錯誤,它們將返回false 。 這仍然是PHP開發人員中最常見的錯誤之一!
這是我編寫此代碼的方式。
連接到PDO時,請啟用例外。 參見http://php.net/manual/en/pdo.error-handling.php
$db_found = new PDO(...);
$db_found->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
然后是該例程的代碼:
$placeholders = ":ip, :flt_status, :sunrise";
$values = array(
'ip' => $ip,
'flt_status' => null,
'sunrise' => $sunrise
);
$columns = "ip, flt_status, sunrise";
$sql = "INSERT INTO skeds ($columns) VALUES ($placeholders)";
$stmt = $db_found->prepare($sql);
$stmt->execute($values);
您的代碼中有幾個錯誤,請嘗試像這樣調整它:
$sql = "INSERT INTO skeds ( ip, flt_status, sunrise ) VALUES ( :ip, :flt_status, :sunrise )";
$query = $db_found->prepare( $sql );
$query->execute( array(':ip'=> $ip,
':flt_status'=>null,
':sunrise'=>$sunrise
));
當你說
$match = array(
‘:ip’=>”$ip”,
‘:flt_status’=>”null, PDO::PARAM_INT”,
’:sunrise’=>”$sunrise”
);
它將使用實際的字符串“ null,PDO :: PARAM_INT”。 如果要為NULL,則將占位符綁定到PHP值null
。
您必須了解字符串和PHP代碼之間的區別。
"null, PDO::PARAM_INT"
是一個字符串。 您不能將PHP代碼存儲在字符串中。
"null"
AGAIN也不是NULL值,但是字符串包含單詞“ null
如果要ot綁定null,則只需綁定PHP NULL value 。 是的,就這么簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.