Multi Query для вставки и удаления данных - PullRequest
0 голосов
/ 19 февраля 2020

Я изо всех сил пытаюсь понять, как работают несколько запросов.

Я хочу вставить данные из одной таблицы в другую, а затем удалить данные из исходной таблицы. Как я могу это сделать? Является ли метод ниже жизнеспособным?

<?php

$con =  mysqli_connect('localhost:3308','root','');

if(!$con)
{
    echo 'Not Connected To Server';
}

if(!mysqli_select_db($con, 'Database'))
{
    echo 'Database Not Selected';
}

$jobNumber = $_POST['jobNumberInsert'];
$siteName = $_POST['siteNameInsert'];
$phoneNumber = $_POST['phoneNoInsert'];
$firstName = $_POST['firstNameInsert'];
$lastName = $_POST['lastNameInsert'];
$streetAddress = $_POST['streetAddressInsert'];
$linetwoAddress = $_POST['linetwoAddressInsert'];
$city = $_POST['cityInsert'];
$county = $_POST['countyInsert'];
$postcode = $_POST['postcodeInsert'];
$serviceInfo = $_POST['serviceInfoInsert'];
$jobDate = $_POST['jobDateInsert'];
$priority_value = $_POST['priorityInsert'];

$sql = "INSERT INTO table2(jobNumber,siteName,phoneNumber,firstName,lastName,streetAddress,linetwoAddress,city,county,postcode,serviceInfo,jobDate,priority) 
        VALUES ('$jobNumber','$siteName','$phoneNumber','$firstName','$lastName','$streetAddress','$linetwoAddress','$city','$county','$postcode','$serviceInfo','$jobDate','$priority_value')";

$sql .= "DELETE FROM table1 WHERE jobNumber= $jobNumber";

if(!mysqli_multi_query($con,$sql))
{
    echo 'Not Inserted or Deleted';
}
else
{
    echo 'Inserted and Deleted';
}

header("refresh:2 url=index.php");
?>

В настоящее время после выполнения кода ничего не происходит. Когда операторы выполняются индивидуально, они работают.

Ответы [ 2 ]

3 голосов
/ 20 февраля 2020

Предупреждение: Вы широко открыты для SQL Инъекций и должны использовать параметризованные подготовленные операторы вместо того, чтобы строить запросы вручную. Они предоставляются PDO или MySQLi . Никогда не доверяйте никаким данным! Даже когда ваши запросы выполняются только доверенными пользователями, вы все равно рискуете испортить ваши данные . Экранирования недостаточно!

Не использовать mysqli_multi_query()!

У вас есть только 2 запроса, которые в любом случае разделены. Нет необходимости отправлять их вместе на MySQL.

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$con = new mysqli('localhost:3308','root','', 'Database');
$con->set_charset('utf8mb4');

$stmt = $con->prepare('INSERT INTO table2(jobNumber,siteName,phoneNumber,firstName,lastName,streetAddress,linetwoAddress,city,county,postcode,serviceInfo,jobDate,priority) 
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)');
$stmt->bind_param('sssssssssssss', $_POST['jobNumberInsert'], 
    $_POST['siteNameInsert'],
    $_POST['phoneNoInsert'],
    $_POST['firstNameInsert']
    ...
);
$stmt->execute();

$stmtDel = $con->prepare('DELETE FROM table1 WHERE jobNumber=?');
$stmt->bind_param('s', $_POST['jobNumberInsert']);
$stmt->execute();

    header("refresh:2 url=index.php");
?>

Я также чувствую, что вы должны заключить это в транзакцию. Если удаление завершится неудачно, вероятно, вы также захотите откат вставки.

0 голосов
/ 19 февраля 2020

нет; (точка с запятой) после первого оператора.

$sql = "INSERT INTO table2(jobNumber,siteName,phoneNumber,firstName,lastName,streetAddress,linetwoAddress,city,county,postcode,serviceInfo,jobDate,priority) VALUES ('$jobNumber','$siteName','$phoneNumber','$firstName','$lastName','$streetAddress','$linetwoAddress','$city','$county','$postcode','$serviceInfo','$jobDate','$priority_value');";

Итак, он пытается выполнить как отдельный оператор вместо отдельного оператора.

...