0

我正在尝试替换每个“?” 通过数组中的值在字符串中。每个 ”?” 是数组中的下一个值。

我想知道是否有更好的方法来执行以下操作:

$query = 'SELECT * FROM pages WHERE id = ? AND language = ?';
$values = array('1', 'en');
foreach ($values as $value) {
    $query = preg_replace('/\?/', '\''.$value.'\'', $query, 1);
}
echo '<pre>'.print_r($query, true).'</pre>';

想用原生 PHP(不是 PDO 扩展)来做到这一点。

4

2 回答 2

2

使用绑定

在 PDO 中

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

http://php.net/manual/pl/pdostatement.bindvalue.php

在 mysqli

$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);

http://www.php.net/manual/en/mysqli-stmt.bind-param.php

如果您想以 STUPID 方式执行此操作,则可以使用循环或递归

$select = "SELECT * FROM pages WHERE id = ? AND language = ?";
$params = array('param', 'param2');
while(preg_match('/\?/', $select)) $select = str_replace("?", array_shift($params),     $select);

但这很愚蠢

于 2013-04-30T10:34:52.567 回答
2

Mysqli 和 PDO 与 PHP 一样是原生的。

您可以使用bind_paramfrommysqli来完成此操作。例子:

$stmt = $mysqli->prepare("SELECT * FROM pages WHERE id = ? AND language = ?");
$stmt->bind_param('is', 1, "en");

在这种情况下,iands引用参数的类型,如下表所示(可在链接中找到):

i   corresponding variable has type integer
d   corresponding variable has type double
s   corresponding variable has type string
b   corresponding variable is a blob and will be sent in packets
于 2013-04-30T10:30:45.740 回答