使用多个值的预准备语句

时间:2016-03-22 15:56:25

标签: php mysqli prepared-statement

我希望提高网站上数据库访问的安全性,而普遍的共识似乎是使用准备好的语句。我知道它们是如何工作的,但我想概括它们的用法,因此我需要提供的唯一内容是查询,参数类型和值。但是,我还没有找到任何特别好的资源,因此,我有点迷失方向。

基本上,我想要的是如下。

$query = "SELECT * FROM Table WHERE Column1 = ? AND Column2 = ?";

$array[0] = "string";
$array[1] = 5;
$parameters = "si";

$dbHandler = new mysqli("server", "user", "password", "database");

$stmt = $dbHandler->prepare($query);
$stmt->bind_param($parameters, $array);
$stmt->execute();

//Process results

我知道这不是正确的程序,但问题就在于此。我能做些什么来完成这项工作?我们的想法是$array中的变量数量可能会发生变化,参数列表也会发生变化。

1 个答案:

答案 0 :(得分:0)

  

我需要提供的是查询,参数类型和值。

你走了:

function mysqli_query_params($mysqli, $query, $params, $types = NULL)
{
    $statement = $mysqli->prepare($query);
    $types = $types ?: str_repeat('s', count($params));
    $statement->bind_param($types, ...$params);
    $statement->execute();
    return $statement;
}

可以完全按照您描述的方式使用:

$query = "SELECT * FROM Table WHERE Column1 = ? AND Column2 = ?";
$params = ["string", 5];
$types = "si";
$mysqli = new mysqli("server", "user", "password", "database");

$data = mysqli_query_params($mysqli, $query, $params, $types)->get_result()->fetch_all();

请注意,大多数情况下,您可以避免显式设置类型,并默认情况下将它们作为字符串进行修改。

然而,PDO确实比原始mysqli更有用,你最好使用它。您可以从this tutorial

了解它

P.S。您需要安装PHP> = 5.6和mysqlnd才能运行此代码。否则代码量将增加十倍。这是使用PDO的另一个原因。