php 使用mysqli从数组插入MySQL

ru9i0ody  于 2022-12-25  发布在  PHP
关注(0)|答案(3)|浏览(134)

我想从一个解析过的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);
}
vuktfyat

vuktfyat1#

应该使用预准备语句,使用参数绑定不仅更安全(没有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();
}
efzxgjgh

efzxgjgh2#

看起来你应该在你的数据值周围加上单引号。同时为你的mysqli_query行添加一个mysqli_error检查,这样你就可以实际看到发生了什么:

$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行上添加了mysqli_connect_error检查:

// 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)。请随意调整以最适合您的实际数据类型。

t8e9dugd

t8e9dugd3#

一个更自动的解决方案是:

$link = mysqli_connect('localhost', 'root', 'password', 'mydatabase') or die(mysqli_connect_error());

foreach ($groups as $key => $values) {
    $valuesArray = array();
    // figure out if we have to encapsulate in ''
    foreach($values as $key => $value){
        switch(gettype($value)){
            case 'boolean':
            case 'integer':
            case 'double': // includes float
                $valuesArray[] = $value;
            break;
            case 'string':
                $valuesArray[] = '\''.$value.'\'';
            break;
            default:
                die('not possible');
            break;
        }
    }
    $query = 'INSERT INTO mydatabase.mytable(' . implode(',',array_keys($values)) . ') VALUES (' . implode(',',$valuesArray) . ')';
    // echo $query; // debug
    $result = mysqli_query($link, $query) or die(mysqli_error());
}

这个解决方案也是普通的mysqli,对于外部输入使用预准备语句或pdo之类的!

相关问题