Вставка нескольких строк (один запрос) в MySQL в PHP: Prepare-Execute vs. Prepare-Bind-Execute

Я пишу немного PHP, чтобы принять массив чисел и имен в СООБЩЕНИЕ и вставьте их в таблицу MySQL (с именем Contacts_table) Вот версия, которая работает без ошибок:

<?php

// Includes
require_once 'Admin/Connector.php';

// Test if payload exists
if($_POST){

// Read payload into arrays
$ar = 0;
foreach($_POST as $entry){
$namenum = explode(',', $entry);
$names[$ar] = $namenum[1];
$numbers[$ar] = $namenum[0];
$ar += 1;
}
$namenum = NULL;

// Build SQL query
$sql = 'INSERT INTO Contact_table (NAME, PHONE) VALUES ';
$insertQuery = array();
$insertData = array();
$n = 0;
foreach ($numbers as $num) {
$insertQuery[] = '(?, ?)';
$insertData[] = $names[$n];
$insertData[] = $num;
$n++;
}
$sql .= implode(', ', $insertQuery);
$sql .= ' ON DUPLICATE KEY UPDATE name = COALESCE(VALUES(name), name);';
$n = NULL;
$num = NULL;

// Connect to MySQL database
$connect = dbconn(PROJHOST,PROJDB,PROJDBUSER,PROJDBPWD);

// Execute SQL query
$query = $connect->prepare($sql);
$query->execute($insertData);
$insertQuery = NULL;
$insertData = NULL;
$sql = NULL;
$query = NULL;

// Close connection to MySQL database
$connect = NULL;

}

?>

Однако, как вы можете видеть, я не использую bindParam () здесь и просто подача значений непосредственно в выполнить () функция. Многие рекомендовали мне использовать bindParam () вместо этого для повышения производительности сервера. Это правда или мне лучше с этой программой как есть? Я попытался написать и запустить версию вышеупомянутого кода, используя bindParam:

<?php

// Includes
require_once 'Admin/Connector.php';

// Test if payload exists
if($_POST){

// Read payload into arrays
$ar = 0;
foreach($_POST as $entry){
$namenum = explode(',', $entry);
$names[$ar] = $namenum[1];
$numbers[$ar] = $namenum[0];
$ar += 1;
}
$namenum = NULL;

// Build SQL query
$sql = 'INSERT INTO Contact_table (NAME, PHONE) VALUES ';
$insertQuery = array();
$insertData = array();
$n = 0;
foreach ($numbers as $num) {
$insertQuery[] = '(?, ?)';
$insertData[] = $names[$n];
$insertData[] = $num;
$n++;
}
$sql .= implode(', ', $insertQuery);
$sql .= ' ON DUPLICATE KEY UPDATE name = COALESCE(VALUES(name), name);';
$n = NULL;
$num = NULL;

// Connect to MySQL database
$connect = dbconn(PROJHOST,PROJDB,PROJDBUSER,PROJDBPWD);

// Prepare SQL query
$query = $connect->prepare($sql);

// Bind variables
foreach($insertData as $key => &$ins) {
$connect->bindParam($key+1,$ins);
}

// Execute SQL query
$query->execute();
$insertQuery = NULL;
$insertData = NULL;
$sql = NULL;
$query = NULL;
$key = NULL;
$ins = NULL;

// Close connection to MySQL database
$connect = NULL;

}

?>

Но этот код отказывается работать и возвращает фатальную ошибку — Вызов неопределенного метода PDO :: bindParam (). Что я здесь не так делаю? Я понимаю, что можно написать гораздо более простой код, если я включу выполнить () внутри цикла, но это породило бы несколько запросов, которых я хочу избежать любой ценой. Моя цель — один запрос, несмотря ни на что.

0

Решение

Ты не можешь $connect->bindParam($key+1,$ins);, Потому что у объекта PDO такого метода нет. Только PDOStatement имеет. Вот почему у вас есть сообщение об ошибке.

Вам следует :

 $query->bindValue($key+1,$ins);

И вы должны использовать bindValue потому что если нет, все ваши вставленные значения получат одно и то же значение (последний из $ ins перед вызовом execute).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]