簡體   English   中英

使用PHP / PDO設置NULL值

[英]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.

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