是否可以从PDO准备语句中获取参数名称

时间:2013-12-07 12:39:17

标签: php pdo

我有一个准备好的查询,比如说

SELECT * FROM userSignLog WHERE userID = :uid AND userStatus = :status

其中,值为:uid和:status将与$ _POST数组中的其他值一起传递。

现在,我想仅动态传递(或绑定):uid和:当前查询的状态。我正在遍历整个$ _POST数组,将$ _POST [name]作为参数名称,并将声明的参数绑定为$ _POST [name]的值。

执行时,PHP会抛出错误:

  

SQLSTATE [HY093]:参数号无效:绑定变量数与令牌数不匹配

如果我能以某种方式设法从准备好的语句中获取令牌名称列表,我只能从我的POST数组中获取那些值,绑定并执行查询。我是否愿意知道是否可以从准备好的声明中获取列表?

2 个答案:

答案 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类,特别是方法bindValueexec以生成该信息。您还可以添加方法getParams()

要使PDO使用您的自定义语句类,您需要发出:

$pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('CustomStatement', array($pdo)));