Может ли подготовленный оператор содержать несколько запросов в php - PullRequest
0 голосов
/ 28 октября 2019

В последнее время я пытаюсь защитить свои запросы от SQL-инъекций. Я начал превращать строки, которые использовал, чтобы превратить запросы в операторы, однако некоторые строки, которые я создал, должны выполнять несколько запросов одновременно, потому что идентификатор одной вставки будет добавлен к следующей как внешний ключ, который я будуполучить с помощью LAST_INSERT_ID (), и мне нужно, чтобы они выполнялись один за другим из-за этого.

Может ли оператор содержать несколько запросов одновременно и выполняться одновременно?

Вот чтокод был раньше, по.

$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);```

1 Ответ

4 голосов
/ 28 октября 2019

Вы не можете выполнить несколько операторов в подготовленном запросе :

Синтаксис 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%, чего вы пытаетесь достичь с помощью <code>role_id ". $ RestaurantInsert." , вам может потребоваться соответствующим образом отредактировать второй запрос, чтобы использовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...