#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
). Не стесняйтесь настраивать, чтобы наилучшим образом соответствовать вашим фактическим типам данных.