Я пытаюсь использовать ответ staticsan в этом вопросе для подготовленных заявлений. Давайте рассмотрим этот пример:
$stmt = $mysqli->prepare("INSERT INTO something (userid, time, title) VALUES (?, ?, ?)"); $stmt->bind_param('iis', $userid, time(), $title); $stmt->execute();
В ответном ответе staticsan массив добавляет все значения в оператор mysql, чтобы в итоге мы могли вставить несколько данных в базу данных только с одним утверждением. Как это будет сделано в моем примере?
Это вполне справедливо:
$stmt = $mysqli->prepare("INSERT INTO something (userid, time, title) VALUES (?, ?, ?)"); $stmt->bind_param('iis', $userid, time(), $title); $stmt->execute(); $stmt->bind_param('iis', $userid, time(), $title); $stmt->execute(); $stmt->bind_param('iis', $userid, time(), $title); $stmt->execute(); $stmt->bind_param('iis', $userid, time(), $title); $stmt->execute();
Вы можете предвидеть над вашим массивом значений, чтобы вставлять и связывать и выполнять каждый раз. Это не так быстро, как объемная вставка в примере, который вы связали, но он будет более безопасным.
Вы можете создать подготовленное заявление с использованием кода, как указано здесь,
PDO Prepared Вставляет несколько строк в один запрос
PHP-логика будет похожа,
/** * Insert With Ignore duplicates in Mysql DB. * * @param string $date Date. */ public static function insertWithIgnore($em, $container, $tableName, $fields, $rows) { $query = "INSERT IGNORE INTO $tableName (`" . implode('`,`', $fields) . "`) VALUES "; $placeHolr = array_fill(0, count($fields), "?"); $qPart = array_fill(0, count($rows), "(" . implode(',', $placeHolr) . ")"); $query .= implode(",", $qPart); $pdo = self::getPDOFromEm($em, $container); $stmt = $pdo->prepare($query); $i = 1; foreach ($rows as $row) { $row['created_at'] = date("Ymd H:i:s"); foreach ($fields as $f) { if (!isset($row[$f])) { $row[$f] = null; } $stmt->bindValue($i++, $row[$f]); } } $result = $stmt->execute(); if ($result == false) { $str = print_r($stmt->errorInfo(), true); throw new \Exception($str); } $stmt->closeCursor(); $pdo = null; } /** * Replace old rows in Mysql DB. * * @param string $date Date. */ public static function replace($em, $container, $tableName, $fields, $rows, $extraFieldValues = null) { if ($extraFieldValues != null) { $fields = array_unique(array_merge($fields, array_keys($extraFieldValues))); } $query = "REPLACE INTO $tableName (`" . implode('`,`', $fields) . "`) VALUES "; $placeHolr = array_fill(0, count($fields), "?"); $qPart = array_fill(0, count($rows), "(" . implode(',', $placeHolr) . ")"); $query .= implode(",", $qPart); $pdo = self::getPDOFromEm($em, $container); $stmt = $pdo->prepare($query); $i = 1; foreach ($rows as $row) { if ($extraFieldValues != null) { $row = array_merge($row, $extraFieldValues); } foreach ($fields as $f) { $stmt->bindValue($i++, $row[$f]); } } $stmt->execute(); if (!$stmt) { throw new \Exception("PDO::errorInfo():" . print_r($stmt->errorInfo(), true)); } $stmt->closeCursor(); $pdo = null; }
Запрос выглядит так:
INSERT INTO people (name, age) VALUES ('Helen', 24), ('Katrina', 21), ('Samia', 22), ('Hui Ling', 25), ('Yumie', 29)