PHP - MySQL запрос не работает полностью - PullRequest
0 голосов
/ 06 июня 2018

Я использую запрос REPLACE INTO для обновления базы данных из массива, используя foreach.

foreach ($data as $row) {

$outletid = $row['outletid'];
$loc = $row['loc'];
$coname = $row['coname'];
$addr1 = $row['addr1'];
$addr2 = $row['addr2'];
$addr3 = $row['addr3'];
$type1 = $row['type1'];
$type2 = $row['type2'];
$type3 = $row['type3'];
$type4 = $row['type4'];
$type5 = $row['type5'];
$mdate = $row['mdate'];

$sql = $conn->prepare("REPLACE INTO syscompany (outletid, loc, coname, addr1, addr2, addr3, type1, type2, type3, type4, type5, mdate)
                         VALUES ('$outletid', '$loc', '$coname', '$addr1', '$addr2', '$addr3', '$type1', '$type2', '$type3', '$type4', '$type5', '$mdate')");

$sql -> execute();
}

У меня есть 147 rows записей в моей базе данных.Тем не менее, запрос просто не работает полностью.Я попытался delete 30 rows и изменить случайные строки из моей базы данных, и запрос только вставляет обратно 5 rows и обновляет около нескольких строк.Я попытался print_r все мои переменные $outletid, $loc ... и все значения внутри все правильно.Я не уверен, как это произойдет.

Я также пытался echo ошибки, но ничего не появляется.

if (!mysqli_query($conn,$sql))
{
echo("Error description: " . mysqli_error($conn));
}

1 Ответ

0 голосов
/ 06 июня 2018

Шаблон в коде выглядит уязвимым для SQL-инъекций.Рекомендуется использовать заполнители связывания и предоставлять значения в качестве значений связывания.

статический текст SQL

$sql = 'REPLACE INTO syscompany
        ( outletid, loc, coname
        , addr1, addr2, addr3
        , type1, type2, type3
        , type4, type5, mdate
        ) VALUES
        ( ?, ?, ?
        , ?, ?, ?
        , ?, ?, ?
        , ?, ?, ?
        )'; 

подготовка текста SQL в оператор

if(! $stmt = $conn->prepare($sql)) {
   // handle error
}

тогда мы можем обработать RBAR в цикле, выполнив предварительно подготовленный оператор ...

foreach( ... ) {
    ...   
    ... 

    // bind values and execute 
    $stmt->bind_param('ssssssssssss'
        , $outletid, $loc, $coname
        , $addr1, $addr2, $addr3
        , $type1, $type2, $type3
        , $type4, $type5, $mdate);

    if(! $stmt->execute() ) {
        // handle error
    }
}

Мы не знаем, имеет ли таблица ПЕРВИЧНЫЙКЛЮЧ или любые УНИКАЛЬНЫЕ индексы.Мы можем только строить догадки.Поведение будет зависеть от того, какие строки уже существуют в таблице.

REPLACE INTO работает как последовательность операторов DELETE, за которыми следует INSERT.Предполагая, что outletid является ПЕРВИЧНЫМ КЛЮЧОМ таблицы, и что (coname,addr1) является УНИКАЛЬНЫМ КЛЮЧОМ

. REPLACE INTO будет эквивалентно выполнению этих двух операторов

 DELETE FROM syscompany WHERE outletid = ? ;
 DELETE FROM syscompany WHERE coname = ? and addr1 = ? ;

(сзначения, предоставленные из строки, которая будет вставлена), затем

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