【问题标题】:Insert multiple rows into mysql with php using foreach arrays使用foreach数组使用php将多行插入mysql
【发布时间】:2010-12-21 11:30:01
【问题描述】:

我被卡住了,现在已经尝试了 2 个小时。我已经弄清楚了foreach循环,但现在不知道如何插入数据。

这是我的 php,我做错了什么?

    $query = "INSERT INTO images (thumb_path, image_path, main_image, project_id) VALUES ";  
foreach($_POST as $key => $value) {
    $query .= "$thumb_path,$image_path,$main_image,$_POST[project_id])";
    $result = mysql_query($query, $connection);
}

谢谢!

我应该这样布置吗,对不起,对于 foreach 还是一个新手以及它是如何工作的。

foreach($_POST as $key => $value) {
    $query = "INSERT INTO images VALUES (thumb_path, image_path, main_image, project_id),";  
    $query .= "$value[thumb_path], $value[$image_path], $value[$main_image], '$_POST[project_id'])";
}

$result = mysql_query($query, $connection);

【问题讨论】:

    标签: php mysql arrays forms foreach


    【解决方案1】:

    这里有几个问题:

    1. 值列表中缺少左括号(VALUES 之后)
    2. 您在foreach 的每次迭代中都运行mysql_query。相反,您可能希望先构建字符串(使用多个值列表),然后在循环外运行 mysql_query
    3. 您不能以这种方式将$_POST['project_id'] 变量插入字符串
    4. 您需要在将$_POST 数据放入数据库之前对其进行转义!
    5. 您实际上并未在查询中使用 foreach 中的 $key$value,您只是将其丢弃。
    6. 循环内的变量($thumb_path 等)对于循环的每次迭代都是相同的,因此您每次都将插入相同的数据。
    7. 循环的逻辑没有意义。你不知道$_POST 有多长,也不知道其中可能包含什么,那么为什么要循环遍历$_POST

    一些提示可以帮助您解决所有这些问题:

    1. 检查您的错误日志。
    2. var_dump执行查询前的SQL字符串,检查语法和逻辑是否正确。

    如果您需要进一步的帮助,我建议您 var_dump $_POST 中的内容,尝试编写您认为查询应该是什么样子,然后在此处发布两者。那么也许有人会帮助你从一个到另一个。

    【讨论】:

    • 应该这样设置吗? foreach($_POST as $key => $value) { $query = "插入图像值 (thumb_path, image_path, main_image, project_id),"; $query .= "$value[thumb_path], $value[$image_path], $value[$main_image], '$_POST[project_id'])"; } $result = mysql_query($query, $connection);
    【解决方案2】:

    我发现这样的事情比你正在做的重复字符串连接更容易维护:

    $values = array();
    foreach ($_POST as $key => $value) {
        $qvalue = mysql_real_escape_string($value);
        $values[] = "($field1, $field2, $field3, $qvalue)"; // quoted value, not the raw value
    }
    
    $query_values = implode(',', $values);
    
    $query = "INSERT INTO images (field1, field2, field3, field4) VALUES $query_values";
    $result = mysql_query($query, $connection);
    

    请记住,在构建这样的查询时,完全有可能构建一个足够大的查询,除了 max_packet 长度,在这种情况下,您必须将插入拆分为多个较小的查询。

    【讨论】:

      【解决方案3】:

      首先,使用 mysql_real_esape_string 转义 $_POST[project_id]。

      那么,syntax 就是 INSERT INTO table VALUES ( ... ), ( ... )

      【讨论】:

        【解决方案4】:
        // escape your input
        $_POST = array_map('addslashes', $_POST);
        
        // rather than recursively calling mysql_query, you can insert all your rows with one query
        // INSERT INTO table (columns) VALUES (data), (data), (data), ...
        $values = array();
        foreach($_POST as $key => $value) {
            $values[] = "('{$_POST['thumb_path']}', '{$_POST['image_path']}', '{$_POST['main_image']}', '{$_POST['project_id']}')";
        }
        if(sizeof($values)) {
            $query = "INSERT INTO images (thumb_path, image_path, main_image, project_id) VALUES ".implode(',', $values);
            $result = mysql_query($query, $connection);
        }
        

        【讨论】:

        • 感谢您的帮助,这似乎有效,但值没有被拉出。相反,它将所有内容作为“数组”存储在数据库中。有什么想法可以解决这个问题吗?
        猜你喜欢
        • 2023-03-13
        • 2013-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-19
        • 2014-02-25
        • 2012-01-04
        • 2015-09-19
        相关资源
        最近更新 更多