PDO вставляет несколько строк в один запрос - PullRequest
0 голосов
/ 17 мая 2019

я пытаюсь поместить несколько массивов php в оператор вставки и поместить его в базу данных sql.У меня нет большого опыта в программировании, поэтому я попробовал это.Но вы не можете bindValue массив PHP, так что он дает ноль.Как я могу это исправить.

$ voornamen, $ geslachten, $ achternamen, $ geboortedata - это четыре отдельных массива php, которые содержат данные нескольких имен пользователей, даты рождения, фамилии и т. Д.

код phpвставить:

$query = $conn->prepare( "INSERT INTO ReserveerCursusCursisten 
    (Geslacht, Achternaam, Voorletters, Geboortedatum) VALUES (:geslachten, :achternamen, :voornamen, :geboortedata, 0, 0)");
for($i = 0; $i < count($achternamen); $i++)
{
    $stmt->bindValue(':geslachten', $geslachten);
    $stmt->bindValue(':achternamen', $achternamen);
    $stmt->bindValue(':voornamen', $voornamen);
    $stmt->bindValue(':geboortedata', $geboortedata);
    $stmt->execute();
}

if ($stmt->execute())
{
  echo "query is gelukt";
}
else
{
    echo "query is niet gelukt";
}

Ответы [ 2 ]

2 голосов
/ 17 мая 2019

Примите во внимание следующее:

  • ваши массивы должны иметь одинаковое количество элементов

  • переменная $query никогда не используется, замените ее на$stmt

  • у вас есть четыре имени столбца, но шесть значений в выражении SQL

  • передают элемент массива в binValue(), а не в массив

Пример:

<?php
$stmt = $conn->prepare(
    "INSERT INTO ReserveerCursusCursisten 
        (Geslacht, Achternaam, Voorletters, Geboortedatum) 
    VALUES 
        (:geslachten, :achternamen, :voornamen, :geboortedata)
");
for($i = 0; $i < count($achternamen); $i++)
{
    $stmt->bindValue(':geslachten', $geslachten[$i]);
    $stmt->bindValue(':achternamen', $achternamen[$i]);
    $stmt->bindValue(':voornamen', $voornamen[$i]);
    $stmt->bindValue(':geboortedata', $geboortedata[$i]);
    if ($stmt->execute() === false) {
        echo "query is niet gelukt";
    } else {
        echo "query is gelukt";
    }
}
?>

Примечания:

Вы можете пропустить bindValue() и передать параметры в execute().В этом случае все параметры обрабатываются как строки (PDO::PARAM_STR), тогда как с помощью bindValue() вы можете определить тип данных параметра (одна из PDO::PARAM_* констант).

<?php
$stmt = $conn->prepare(
    "INSERT INTO ReserveerCursusCursisten 
        (Geslacht, Achternaam, Voorletters, Geboortedatum) 
    VALUES 
        (:geslachten, :achternamen, :voornamen, :geboortedata)
");
for ($i = 0; $i < count($achternamen); $i++)
{
    $params = array($geslachten[$i], $achternamen[$i], $voornamen[$i], $geboortedata[$i]);
    if ($stmt->execute($params) === false) {
        echo "query is niet gelukt";
    } else {
        echo "query is gelukt";
    }
}
?>

Часть документации PHP оподготовленные операторы:

вызов PDO :: prepare () и PDOStatement :: execute () для операторов, которые будут выполняться несколько раз с различными значениями параметров, оптимизирует производительность вашего приложения, позволяя драйверу согласовыватькэширование на стороне клиента и / или сервера плана запроса и метаинформации.Кроме того, вызов PDO :: prepare () и PDOStatement :: execute () помогает предотвратить атаки SQL-инъекций, устраняя необходимость вручную заключать в кавычки и экранировать параметры.

0 голосов
/ 17 мая 2019

Это способ построения запроса: сначала вы строите весь SQL, а затем привязываете значения к каждому столбцу и строке:

$query = "INSERT INTO ReserveerCursusCursisten 
(Geslacht, Achternaam, Voorletters, Geboortedatum) VALUES ";

$subqueries = [];

for($ii=0; $ii< count($geslachten);$ii++) {
    $subqueries []="(:ges$ii,:ach$ii,:voo$ii,:geb$ii)";
}

$query .= implode(",", $subqueries);

$stmt = $conn->prepare($query);

for($ii=0; $ii< count($geslachten);$ii++) {
    $stmt->bindValue(":ges$ii", $geslachten[$ii]);
    $stmt->bindValue(":ach$ii", $achternamen[$ii]);
    $stmt->bindValue(":voo$ii", $voornamen[$ii]);
    $stmt->bindValue(":geb$ii", $geboortedata[$ii]);
}
$stmt->execute();
...