【问题标题】:PDO Bind parameters without having to list :var in query [duplicate]PDO绑定参数而不必在查询中列出:var [重复]
【发布时间】:2017-07-19 12:56:32
【问题描述】:

我正在为我的数据库类创建一个抽象。

一个方法用于调用过程,它接受过程名称和一个变量数组。

问题在于,通常使用 PDO 您必须在查询中列出变量(EXEC procName :var1、:var2、:var3),然后才能将变量绑定到这些变量。

我希望能够按顺序绑定数组中的变量,而不必如上面括号中所示列出变量的名称或查询中的变量数量。

这是通常的做法:

$query = $database->prepare("EXEC procName :var1, :var2"); //I must list the amount and names of vars
$query->execute(array(":var1" => $var1, ":var2" => $var2);

这就是我想要的方式:

$query = $database->prepare("EXEC procName"); //I don't have to list the vars here, which will allow for a dynamic amount to be passed in (very reusable)
$query->execute($arrayOfVars); //Binding an array of arguments to the proc

但是,上面的代码不起作用。有没有办法做到这一点?

【问题讨论】:

  • 您希望代码如何工作? $arrayOfVars 中的值应该添加到查询的什么位置?
  • @u_mulder 按它们所在的顺序。数组中的第一个变量将绑定为过程中的第一个参数。
  • 这是可能的,但您必须注意 SQL 注入。见我的文章An SQL injection against which prepared statements won't help
  • @YourCommonSense 我不知道存储过程可以进行注入。
  • 任何东西都可以注射。

标签: php pdo


【解决方案1】:

例如我有函数getCountry

mysql> call getCountry('ua');
+----+------+
| id | name |
+----+------+
|  3 | ua   |
+----+------+

我使用下一个代码

$pdo = new PDO('mysql:host=localhost;port=3306;dbname=test', 'root');
$s = $pdo->prepare('CALL getCountry(:p1)');
$params = [':p1' => 'ua'];
$s->execute($params);
$result = $s->fetchAll(PDO::FETCH_ASSOC);
var_export($result);

这为我提供了下一个结果:

array (
  0 => 
  array (
    'id' => '3',
    'name' => 'ua',
  ),
)

我希望你也可以这样做......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 2017-04-17
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    相关资源
    最近更新 更多