【问题标题】:Are there numbered placeholders for mysql prepared statementmysql准备好的语句是否有编号的占位符
【发布时间】:2018-12-18 17:15:01
【问题描述】:

我正在尝试使用 mysql 准备好的语句。 我想知道是否有可能像我可以在 sprintf 或 vsprintf 中使用编号的占位符。 例如:

<?php
$format = 'The %2$s contains %1$d monkeys';
echo sprintf($format, $num, $location);
?>

【问题讨论】:

  • 一些库允许你使用比编号更好的命名参数。

标签: mysql prepared-statement


【解决方案1】:

这取决于您在 PHP 中使用的 SQL 库。

如果您使用PDO 库,您可以使用命名参数,这与使用数字相同。 http://php.net/manual/en/pdostatement.bindparam.php 给出了一个例子:

$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();

在上面,由于参数是命名的,因此提供“卡路里”和“颜色”变量的顺序或它们在语句中出现的位置都无关紧要。

但是mysqli 不支持这一点,您必须使用简单的? 占位符,然后按照它们要使用的确切顺序提供参数 - 请参阅http://php.net/manual/en/mysqli-stmt.bind-param.php

【讨论】:

  • 我不使用mysqli的一大原因..我不知道它是什么..我只是不喜欢?占位符
  • 据我所知,PDO 模拟了这种行为。在内部,可能使用了 sprintf。另外,我读过 PDO 应该比 MySQLi 慢。不知道这是否属实。所以我想使用 MySQLi。所以我必须使用 MySQLi 在 bind_result 中写入相同的变量,就像我在查询中使用的一样。出现的问题是是否使用 sprintf 更好地使用 MySQLi 生成查询并首先通过 mysqli_real_escape_string 发送字符串变量。
  • @AlexanderBehling “据我所知,PDO 模拟了这种行为。” ...这取决于PDO::ATTR_EMULATE_PREPARES 的值(请参阅php.net/manual/en/pdo.setattribute.php) - 您是否模拟prepares 应该取决于底层数据库驱动程序是否支持本机prepared statements。如果是这样,你应该尽可能使用原生的。
  • @AlexanderBehling mysqli_real_escape_string 可以在不明确的情况下被规避(stackoverflow.com/questions/5741187/…),因此理想情况下您应该使用准备好的语句。此外,它还降低了您引入意外语法错误的可能性。至于 PDO 是否比 mysqli 慢,我认为这可能取决于很多因素。你有什么确凿的证据吗?
  • @ADyson 感谢您指出这一点。但我不清楚不使用 (v)sprintf 而不是准备好的语句有什么好处。它会给我同样的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多