绑定一个 PHP 数组以进行 SQL 插入
P粉928591383
P粉928591383 2023-08-08 15:51:43
[PHP讨论组]

尝试绑定一个数组(第一个数组绑定)以防止SQL注入

这是有效的代码:


if (isset($_POST['checkbox_selected']))
{       
    $valuesArr = array(); 
    foreach ($_POST['checkbox_selected'] as $key => $value) {
        //检索Array ID以查找CSVOption列的行号
        $findrow = array_search_partial($attributeid, $value);
        //在表单提交时,属性值被分配给属性 id
        $attribute = $value;            
        $csv = $csvcolumn[$findrow];        
        $valuesArr[] = "('$userid', '$feed_id', '$attribute', '$csv')";         
    }
        
    $sql = "INSERT INTO map (user_id, feed_id, attribute_id, csvcolumn) values ";
    $sql .= implode(',', $valuesArr);
    mysqli_query($conn,$sql);
}

我无法绑定该数组,已尝试:

$sql = "INSERT INTO map (user_id, feed_id, attribute_id, csvcolumn) VALUES (?, ?, ? ,?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param('iiii', implode(',', $valuesArr));
$stmt->execute();

echo implode(',', $valuesArr)
//('1', '1', '13', '9') //这是被插入到SQL中的数组
//(user_id, feed_id, attribute_id, csvcolumn) //这里是第一个语句中分配的值


P粉928591383
P粉928591383

全部回复(1)
P粉384679266

你有两个问题:

你没有使用正确的bind语法。

你试图在一个预处理语句中插入多行

if (isset($_POST['checkbox_selected']))
{
    $sql = "INSERT INTO map (user_id, feed_id, attribute_id, csvcolumn) VALUES (?, ?, ?, ?);";
    // prepare only has to happen once
    $stmt = mysqli_prepare($conn,$sql);

    mysqli_begin_transaction($conn);
    try {
        foreach ($_POST['checkbox_selected'] as $key => $value) {
            $findrow = array_search_partial($attributeid, $value);
            $attribute = $value;            
            $csv = $csvcolumn[$findrow];
            
            $stmt->bindParam('iiii', $userid, $feed_id, $attribute, $csv);
            $stmt->execute();
        }
        mysqli_commit($conn);
    } catch(mysqli_sql_exception $e) {
        mysqli_rollback($conn); // immediately roll back changes
        throw $e; // re-throw exception
    }
}

唯一的微弱好处是,你尝试在一个查询中打包多个VALUES()时,它会被隐式事务包装。但是这种方法的其他方面都是不利的。明确地打开包裹绑定/执行循环的事务,可以获得相同的好处[错误回滚,IO批处理],同时也能利用预处理语句的好处[单个简单查询解析,参数化等]

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号