PDOStatement::bindParam()
和PDOStatement::bindValue()
什麼PDOStatement::bindValue()
? php
這是我能夠考慮的一些事項: 數據庫
bindParam
,您只能傳遞變量; 沒有價值 bindValue
,您能夠同時傳遞(值,顯然和變量) bindParam
只適用於變量,由於它容許參數經過「引用」做爲輸入/輸出給定(而且在PHP中,值不是有效的「引用」) :它對於(引用手冊的)驅動程序頗有用: 支持調用存儲過程,該存儲過程將數據做爲輸出參數返回,有些還做爲輸入/輸出參數發送數據並進行更新以接收數據。 spa
對於某些數據庫引擎,存儲過程能夠具備既可用於輸入(將PHP的值提供給過程的值)又可用於輸出(將值從存儲的proc返回至PHP)的參數; 要綁定這些參數,您必須使用bindParam,而不是bindValue。 .net
答案在bindParam
的文檔中: code
與PDOStatement :: bindValue()不一樣,該變量被綁定爲引用,而且僅在調用PDOStatement :: execute()時進行評估。 pdo
並execute
文檔
調用PDOStatement :: bindParam()將PHP變量綁定到參數標記:綁定變量將其值做爲輸入傳遞,並接收其關聯參數標記的輸出值(若是有) 字符串
例: get
$value = 'foo'; $s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz'); $s->bindParam(':baz', $value); // use bindParam to bind the variable $value = 'foobarbaz'; $s->execute(); // executed with WHERE baz = 'foobarbaz'
要麼 it
$value = 'foo'; $s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz'); $s->bindValue(':baz', $value); // use bindValue to bind the variable's value $value = 'foobarbaz'; $s->execute(); // executed with WHERE baz = 'foo'
對於最多見的目的,您應該使用bindValue
。
bindParam
具備兩種棘手或意外的行爲:
bindParam(':foo', 4, PDO::PARAM_INT)
不起做用,由於它須要傳遞一個變量(做爲參考)。 execute()
以後bindParam(':foo', $value, PDO::PARAM_INT)
會將$value
更改$value
字符串。 固然,這會致使可能難以捕獲的細微錯誤。 資料來源: http : //php.net/manual/en/pdostatement.bindparam.php#94711
使用bindParam
經過一次綁定插入多行:
<?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); $stmt->bindParam(1, $name); $stmt->bindParam(2, $value); // insert one row $name = 'one'; $value = 1; $stmt->execute(); // insert another row with different values $name = 'two'; $value = 2; $stmt->execute();
最簡單地將其視爲行爲記憶的方式(就PHP而言):
bindParam:
參考 bindValue:
變量