准备好的语句能否在php中包含多个查询

问题描述 投票:0回答:1

最近,我试图保护我的查询免受SQL注入。我已经开始将用于查询的字符串转换为语句,但是,我制作的某些字符串需要同时进行多个查询,因为一个插入的ID将作为外键添加到下一个中​​,通过使用LAST_INSERT_ID()获得,因此我需要将它们一个接一个地执行。

一条语句可以同时保存多个查询并一次执行吗?

这里是以前的代码,by。

$sql = "INSERT INTO `user_info`(`first_name`, `last_name`, `phone`, `cpf`) 
            VALUES ('{$firstName}', '{$lastName}', '{$phone}', '{$cpf}');";
$sql .= "SELECT LAST_INSERT_ID() INTO @mysql_variable_here;";
$sql .= "INSERT INTO `{$table}`(`email`, `password`, `active`,`user_info_id`, `created`, `role_id`" . $restaurantInsert . ")
            VALUES ('{$email}','{$password}', 1, @mysql_variable_here, '{$created}', {$role}" . $restaurantValue . " );"; 
$sql .= "INSERT INTO `address`(number, street, city, state, zip, district, country, created, user_info_id)
            VALUES ('{$number}', '{$street}', '{$city}', '{$stateCode}', '{$zip}', '{$district}', 'BR', '{$created}', @mysql_variable_here);";

$result = $conn->multi_query($sql);```
php sql mysqli prepared-statement
1个回答
1
投票

您不能在prepared query中执行多个语句:

准备好的语句的SQL语法不支持多语句(也就是说,单个字符串中的多个语句用;分隔;字符)

所以您将需要分别准备并执行每个查询,并使用mysqli_stmt::insert_id为第二个和第三个查询获取适当的id值:

$sql = "INSERT INTO `user_info`(`first_name`, `last_name`, `phone`, `cpf`) 
            VALUES (?, ?, ?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param('ssss', $firstName, $lastName, $phone, $cpf);
$stmt->execute();
$insert_id = $stmt->insert_id;
$stmt->close();

$sql = "INSERT INTO `{$table}`(`email`, `password`, `active`,`user_info_id`, `created`, `role_id`" . $restaurantInsert . ")
            VALUES (?, ?, ?, ?, ?, ?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param('ssiisss', $email, $password, 1, $insert_id, $created, $role, $restaurantValue);
$stmt->execute();
$stmt->close();

$sql = "INSERT INTO `address`(number, street, city, state, zip, district, country, created, user_info_id)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);";
$stmt = $conn->prepare($sql);
$country = 'BR';
$stmt->bind_param('sssssssi', $number, $street, $city, $stateCode, $zip, $district, $country, $created, $insert_id);
$stmt->execute();
$stmt->close();

请注意,我不确定100%是否要使用role_id" . $restaurantInsert . "实现,您可能需要适当地编辑第二个查询才能使用它。

© www.soinside.com 2019 - 2024. All rights reserved.