iT邦幫忙

0

PHP 上使用 PDO bindParam 問題

我使用以下程式執行在網易的PHP主機上,寫入json_test這個table 後,json_key & json_value 兩個欄位都是test2的值(正常應該是json_key:a2,json_value:test2才對),但在BlueHost上卻是正常的。

$sql="insert into json_test(json_key,json_value) values(:aa_key,:aa_value)";

$st=$pdo->prepare($sql);

$data=array("aa_key"=>"a2", "aa_value"=>"test2");

foreach ($data as $key => $value) {
    $st->bindParam($key, $value);
}

$st->execute();

但使用以下卻可以正常

$sql="insert into json_test(json_key,json_value) values(:aa_key,:aa_value)";

$st=$pdo->prepare($sql);

$key="a1";$value="test1";

$st->bindParam("aa_key", $key);
$st->bindParam("aa_value", $value);

$st->execute();

請問這有可能是什麼設定造成的?

1 個回答

1
㊣浩瀚星空㊣
iT邦超人 1 級 ‧ 2020-09-23 09:59:16
最佳解答

那是你誤會了 bindParam 的用法。
bindParam的用法是會跟你指定的變數做綁定變動。

你第一種寫法。變數非固定的,而是foreach出來的變數。
其最後結果就是

$key = 'aa_value';
$value = 'test2';

所以兩次都會是test2是很正常的事。

要用 bindParam 要注意,它不是所謂的給與值。而是一種綁定變數的做法。

至於另外一個為何可以這樣用我就不清楚了。
不過不正規的使用法我是採取,不能用只是剛好,能用你就得小心雷的想法。

不會去說或問為何他能這樣用沒事。

gmlin iT邦新手 5 級 ‧ 2020-09-23 11:22:32 檢舉

您好:

真是太久沒用PHP,加上BH沒有問題,一時忘記bindParam的用法。

我改成這樣就好了,感謝提醒!!

        foreach ($data as $key => $value) {
            $st->bindParam($key, $data[$key]);
        }

偷偷的說一句,這個不是php的用法。那其實是pdo的用法。

我要發表回答

立即登入回答