Php 使用多个值准备语句

Php 使用多个值准备语句,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我希望提高网站数据库访问的安全性,一般的共识似乎是使用事先准备好的语句。我知道它们是如何工作的,但我想概括它们的使用,所以我只需要提供查询、参数类型和值。然而,我还没有找到任何特别好的资源来解决这个问题,因此,我有点不知所措 基本上,我想要的是如下 $query = "SELECT * FROM Table WHERE Column1 = ? AND Column2 = ?"; $array[0] = "string"; $array[1] = 5; $parameters = "si";

我希望提高网站数据库访问的安全性,一般的共识似乎是使用事先准备好的语句。我知道它们是如何工作的,但我想概括它们的使用,所以我只需要提供查询、参数类型和值。然而,我还没有找到任何特别好的资源来解决这个问题,因此,我有点不知所措

基本上,我想要的是如下

$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
中的变量数量可能会改变,参数列表也会改变

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

给你:

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更有用,您最好使用它。你可以向我学习

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

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

给你:

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更有用,您最好使用它。你可以向我学习


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

我不清楚您想要实现什么。你说你只想提供“一个查询、参数类型和值”——这正是准备好的语句在任何情况下都可以工作的方式。数组部分是我不知道的。准备语句的标准用法是列出值,如
bind_param(“sss”)、$s1、$s2、$s3),但我想用数组来代替三个字符串变量。对不起,我没有注意到您在
mysqli
中这样做-我以为是PDO,它从一开始就可以处理数组。(如果您只是在切换,而且语法很重要,“使用PDO”在这里可能是一个可行的选择。)老实说,我愿意使用PDO,无论什么都可以。但是,主要目标是避免SQL注入。我已经读到准备好的语句可以缓解这个问题,但这是否也适用于通过PDO准备好的语句?我只见过mysqli的例子。你试过调用用户函数数组()吗?
?我不清楚你想实现什么。你说你只想提供“一个查询、参数类型和值”——这正是准备好的语句在任何情况下都可以工作的方式。数组部分是我不知道的。准备语句的标准用法是列出值,如
bind_param(“sss”)、$s1、$s2、$s3),但我想用数组来代替三个字符串变量。对不起,我没有注意到您在
mysqli
中这样做-我以为是PDO,它从一开始就可以处理数组。(如果您只是在切换,而且语法很重要,“使用PDO”在这里可能是一个可行的选择。)老实说,我愿意使用PDO,无论什么都可以。但是,主要目标是避免SQL注入。我已经读到准备好的语句可以缓解这个问题,但这是否也适用于通过PDO准备好的语句?我只见过mysqli的例子。你试过
调用用户函数数组()
?你必须使用PHP5.6+你必须使用PHP5.6+