2012-10-23 183 views
1

我想破译一个PHP程序中正在做Mysql查询的特定语句。查询有?:和?在里面。有什么功能?带问号和冒号的Mysql声明

$data = db_get_field("SELECT data FROM ?:order_data WHERE order_id = ?i AND type = 'A'", $order_id); 

感谢您的帮助。

Chris

+0

'db_get_field'不是内置函数。找到定义。 –

+0

他正在使用pdo –

+0

许可证已付费。只是好奇什么?:是。 –

回答

1

它们看起来就像预先准备好的语句的占位符。您提供?,您稍后将提供实际值。从PHP文件看看这个例子:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); 
$stmt->bindParam(1, $name); 
$stmt->bindParam(2, $value); 

来源:http://php.net/manual/en/pdo.prepared-statements.php

你具体的例子似乎是从CS-Cart。例如,根据他们的文档?i强制传递到该占位符的值被转换为整数(这与sprintf的工作方式类似)。

$number = 9; 
echo sprintf("I have %d tasks.", $number); 
// Outputs "I have 9 tasks." 

在上述情况下,$number被视为整数。如果我试图将字符串传递到该插槽中,我会得到截然不同的结果:

$number = "completed"; 
echo sprintf("I have %d tasks.", $number); 
// Outputs "I have 0 tasks." 

注意这里怎么我的类型不匹配,因此0输出代替completed

底线,这些是占位符。

+1

这很奇怪,尽管'?'是一个匿名占位符,':order_data'可以是一个名字。我从来没有在查询中看到过这两种混合。 –

+0

@MarcB根据[此评论](http://www.php.net/manual/en/pdostatement.bindparam.php#98715),不支持混合两者。我认为OPs代码在幕后还有其他事情要做。 – Sampson

0

字符?:标识符以形成参数化查询。稍后将值绑定到变量,引擎将执行多个值的查询。这个工作更快,因为查询是由服务器编译一次,而不是编译每个变量=值集。