我有一个准备好的查询,比如说
SELECT * FROM userSignLog WHERE userID = :uid AND userStatus = :status
其中,值为:uid和:status将与$ _POST数组中的其他值一起传递。
现在,我想仅动态传递(或绑定):uid和:当前查询的状态。我正在遍历整个$ _POST数组,将$ _POST [name]作为参数名称,并将声明的参数绑定为$ _POST [name]的值。
执行时,PHP会抛出错误:
SQLSTATE [HY093]:参数号无效:绑定变量数与令牌数不匹配
如果我能以某种方式设法从准备好的语句中获取令牌名称列表,我只能从我的POST数组中获取那些值,绑定并执行查询。我是否愿意知道是否可以从准备好的声明中获取列表?
答案 0 :(得分:3)
您可以捕获PDOStatement::debugDumpParams()
的输出。链接页面上有一个输出示例。
例如: -
$sql = "SELECT * FROM userSignLog WHERE userID = :uid AND userStatus = :status";
$statement = $db->prepare($sql);
$uid = 'testUid';
$status = 'testStatus';
$statement->bindParam('uid', $uid);
$statement->bindParam('status', $status);
ob_start();
$statement->debugDumpParams();
$params = ob_get_clean();
var_dump($params);
提供以下输出: -
string 'SQL: [70] SELECT * FROM userSignLog WHERE userID = :uid AND userStatus = :status
Params: 2
Key: Name: [4] :uid
paramno=-1
name=[4] ":uid"
is_param=1
param_type=2
Key: Name: [7] :status
paramno=-1
name=[7] ":status"
is_param=1
param_type=2
' (length=240)
你想要的信息就在那里,这只是一个挖掘它的问题。
我不确定这会有多么有效,尽管它是我能找到的唯一参考资料。
答案 1 :(得分:1)
由于PDO支持OOP样式界面,您可以自由覆盖PDOStatement类,特别是方法bindValue
和exec
以生成该信息。您还可以添加方法getParams()
。
要使PDO使用您的自定义语句类,您需要发出:
$pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('CustomStatement', array($pdo)));