Вставка в MySQL из массива с помощью mysqli

#php #mysql #sql #mysqli

#php #mysql #sql #mysqli

Вопрос:

Я хочу вставить некоторые данные из проанализированного JSON в таблицу, но когда я это делаю, это не работает, возвращает 0 строк, чего мне не хватает? Я еще новичок в этом «mysqli». У меня есть более 25000 строк для вставки в таблицу.

 $mysqli = mysqli_connect('localhost', 'root', '', '');

$allData = $dataSource->getAllData();
foreach ($allData as $key => $value) {
    $query = 'INSERT INTO `table`(`data_id`, `name`) VALUES (' . $value['data_id'] . ', ' . $value['name'] . ')';
    $result = mysqli_query($mysqli, $query);
}
  

Комментарии:

1. Что возвращает нулевые строки? Я не вижу никакого кода, который делает это здесь. Есть также более эффективный способ сделать это.

2. я использую phpmyadmin, и когда я хочу открыть таблицу, она возвращает 0 строк, которые я еще не получил в коде, я сделаю это после того, как смогу решить эту проблему: D

3. sry забыл опубликовать это, но это в коде, я не получаю ошибок, я думаю, проблема в ЗНАЧЕНИЯХ, которые я хочу вставить, например, $value[‘data_id’]

Ответ №1:

Вы должны использовать подготовленные инструкции. Использование привязки параметров не только безопаснее (без SQL-инъекций), но и немного быстрее, когда вы добавляете 25000 строк.

Ваш исправленный код с отчетами об ошибках и подготовленными инструкциями будет выглядеть следующим образом:

 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'root', '', 'dbname');
$mysqli->set_charset('utf8mb4');

$allData = $dataSource->getAllData();

$stmt = $mysqli->prepare('INSERT INTO `table`(`data_id`, `name`) VALUES (?,?)');

foreach ($allData as $key => $value) {
    $stmt->bind_param('ss', $value['data_id'], $value['name']);
    $stmt->execute();
}
  

Ответ №2:

Похоже, вам следует заключить ваши значения данных в одинарные кавычки. Также добавляю mysqli_error проверку для вашей mysqli_query строки, чтобы вы действительно могли видеть, что происходит:

 $allData = $dataSource->getAllData();
foreach ($allData as $key => $value) {
    $query = "INSERT INTO `table`(`data_id`, `name`) VALUES ('" . $value['data_id'] . "', '" . $value['name'] . "')";
    $result = mysqli_query($mysqli, $query) or die(mysqli_error($mysqli));
}
  

Или, что еще лучше, используйте mysqli_stmt_bind_param так. Разрешить MySQLi обрабатывать всю структуру данных запроса вместо того, чтобы беспокоиться о размещении одинарных кавычек. Кроме того, добавлена проверка mysqli_connect_error на наличие в вашей mysqli_connect строке:

 // Connecting, selecting database
$mysqli = mysqli_connect('localhost', 'root', '', '') or die(mysqli_connect_error());

$allData = $dataSource->getAllData();
foreach ($allData as $key => $value) {
    // Set the query.
    $query = "INSERT INTO `table`(`data_id`, `name`) VALUES (?, ?)";
    
    // Bind the params.
    // mysqli_stmt_bind_param($query, 'ss', $value['data_id'], $value['name']);
    mysqli_stmt_bind_param($query, 'is', $value['data_id'], $value['name']);

    // Run the query.
    $result = mysqli_query($mysqli, $query) or die(mysqli_error($mysqli));
}
  

Обратите внимание, что у меня есть закомментированная строка для mysqli_stmt_bind_param , поскольку мне не ясно, является ли ваше $value['data_id'] число числом или строкой. mysqli_stmt_bind_param($query, 'is',… Означает, что первым значением является целое число ( i ), а следующим значением является строка ( s ). Не стесняйтесь настраивать, чтобы наилучшим образом соответствовать вашим фактическим типам данных.