PDO Prepared Вставляет несколько строк в одном запросе

LOLCODE!

Весь язык. Хотя это не совсем вещь WTF, я никогда не сталкивался с языком, который звучит у меня в голове скрипучим мультяшным голосом. Также я никогда не смотрел на код раньше и хочу воскликнуть «aaaawwww cuuute!»

Эта программа отображает цифры 1–10 и завершается

HAI
CAN HAS STDIO?
IM IN YR LOOP UPPIN YR VAR TIL BOTHSAEM VAR AN 10
    VISIBLE SUM OF VAR AN 1
IM OUTTA YR LOOP
KTHXBYE
135
задан hoball 28 April 2015 в 06:53
поделиться

3 ответа

Вставка нескольких значений с приготовлениями PDO Подготовления

Вставка нескольких значений в одном операторе выполнения. Почему, потому что, согласно эта страница Это быстрее, чем обычные вставки.

$datafields = array('fielda', 'fieldb', ... );

$data[] = array('fielda' => 'value', 'fieldb' => 'value' ....);
$data[] = array('fielda' => 'value', 'fieldb' => 'value' ....);

Дополнительные значения данных или у вас, вероятно, есть цикл, который заполняет данные.

С подготовленными вставками, которые вам нужно знать поля, которые вы вставляете, и количество полей для создания? Защитники для привязки ваших параметров.

insert into table (fielda, fieldb, ... ) values (?,?...), (?,?...)....

Это в основном, как мы хотим, чтобы оператор «Вставить».

Теперь код:

function placeholders($text, $count=0, $separator=","){
    $result = array();
    if($count > 0){
        for($x=0; $x<$count; $x++){
            $result[] = $text;
        }
    }

    return implode($separator, $result);
}

$pdo->beginTransaction(); // also helps speed up your inserts.
$insert_values = array();
foreach($data as $d){
    $question_marks[] = '('  . placeholders('?', sizeof($d)) . ')';
    $insert_values = array_merge($insert_values, array_values($d));
}

$sql = "INSERT INTO table (" . implode(",", $datafields ) . ") VALUES " .
       implode(',', $question_marks);

$stmt = $pdo->prepare ($sql);
try {
    $stmt->execute($insert_values);
} catch (PDOException $e){
    echo $e->getMessage();
}
$pdo->commit();

Хотя в моем тесте было только разница в 1 секунду при использовании нескольких вставок и регулярных подготовленных вставок с одним значением.

141
ответ дан 23 November 2019 в 23:44
поделиться

Это просто не то, как вы используете подготовленные операторы.

Вполне нормально вставлять одну строку в запрос, потому что вы можете выполнить один подготовленный оператор несколько раз с разными параметрами. Фактически, это одно из величайших преимуществ, поскольку оно позволяет вам вставить большое количество строк эффективным, безопасным и удобным способом.

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

12
ответ дан 23 November 2019 в 23:44
поделиться

Два возможных подхода:

$stmt = $pdo->prepare('INSERT INTO foo VALUES(:v1_1, :v1_2, :v1_3),
    (:v2_1, :v2_2, :v2_3),
    (:v2_1, :v2_2, :v2_3)');
$stmt->bindValue(':v1_1', $data[0][0]);
$stmt->bindValue(':v1_2', $data[0][1]);
$stmt->bindValue(':v1_3', $data[0][2]);
// etc...
$stmt->execute();

Или:

$stmt = $pdo->prepare('INSERT INTO foo VALUES(:a, :b, :c)');
foreach($data as $item)
{
    $stmt->bindValue(':a', $item[0]);
    $stmt->bindValue(':b', $item[1]);
    $stmt->bindValue(':c', $item[2]);
    $stmt->execute();
}

Если данные для всех строки находятся в одном массиве, я бы использовал второе решение.

14
ответ дан 23 November 2019 в 23:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: