【问题标题】:How to insert array as key => value with string value into sql using php [closed]如何使用php将数组作为键=>值与字符串值插入sql [关闭]
【发布时间】:2020-10-02 10:56:08
【问题描述】:
foreach($_SESSION['s'] as $key=>$value){
  $name[]="'".$value."'";
}
$name=implode(",",$name);
$conn= mysqli_connect("localhost","root","","slashbill");

for($x=0;$x<=3;$x++){
  $sql = "INSERT INTO slashbill (member,give,receive,paid) VALUES  
  ($name,'".$give[$x]."','".$receive[$x]."','".$paid1[$x]."')";

  $exe=mysqli_query($conn,$sql);
 }

我对名称数组有一个小问题,当我执行上述代码时,每一行的成员值都取值为

我得到了什么

member
-----
name1,name2,name3,name4
name1,name2,name3,name4
name1,name2,name3,name4
name1,name2,name3,name4

我想要的是这个

member
-----
name1
name2
name3
name4

注意:所有其他列都已完美插入,稍后我会考虑 SQL 注入安全性。

【问题讨论】:

    标签: php sql insert


    【解决方案1】:

    认为您只需将$name 保留为一个数组,不要将它内爆回字符串,然后循环遍历它。我不知道$give 和其他人中有什么。我看到它们是数组,但我不明白它们与$name 的关系。以下代码执行此操作并插入 16 条记录(假设 4 个名称):

    // Store names in an array
    $names = [];
    foreach ($_SESSION['s'] as $key => $value) {
        $names[] = $value;
    }
    
    $conn = mysqli_connect("localhost", "root", "", "slashbill");
    $sql = 'INSERT INTO slashbill (member,give,receive,paid) VALUES (?,?,?,?)';
    
    // Loop over names
    foreach ($names as $name) {
        for ($x = 0; $x <= 3; $x++) {
            $stmt = $conn->prepare($sql);
            if (!$stmt) {
                die('Could not prepare statement');
            }
            if (!$stmt->bind_param('ssss', $name, $give[$x], $receive[$x], $paid1[$x])) {
                die('Could not bind statement');
            }
            if (!$stmt->execute()) {
                die('Could not execute statement');
            }
        }
    }
    

    但是,如果会话数据和您的其他变量之间存在某种神奇的关系,并且您真的只想插入 4 行,那么可以使用仍然跟踪 $x 的这个版本。

    // Store names in an array
    $names = [];
    foreach ($_SESSION['s'] as $key => $value) {
        $names[] = $value;
    }
    
    $conn = mysqli_connect("localhost", "root", "", "slashbill");
    $sql = 'INSERT INTO slashbill (member,give,receive,paid) VALUES (?,?,?,?)';
    
    // Loop over names
    for ($x = 0; $x <= count($names); $x++) {
        $stmt = $conn->prepare($sql);
        if (!$stmt) {
            die('Could not prepare statement');
        }
        if (!$stmt->bind_param('ssss', $names[$x], $give[$x], $receive[$x], $paid1[$x])) {
            die('Could not bind statement');
        }
        if (!$stmt->execute()) {
            die('Could not execute statement');
        }
    }
    

    我知道你说过你会担心以后会逃避它,但我只是将其转换为准备好的声明 any 因为它更容易为每个人准备。

    【讨论】:

    • 第一个foreach()有多大成就?
    • @Dharman,我在此站点上发布的所有代码都假定 OP 已关闭警告,因为这在历史上是正确的。我想我本周关闭了十几个简单的“打开错误,你会看到问题”的帖子。所以当我在这里给某人代码时,我总是确保它对他们来说是痛苦的,我会让他们处理以后的配置。过去,我有时会将错误指令放在代码的顶部,但人们只是不会复制和粘贴。
    • @NigelRen,除了循环,我不知道你的意思是什么?你在问为什么foreach 一次然后for 循环?
    • 只是你最终可能会得到$names == $_SESSION['s']
    猜你喜欢
    • 2019-12-30
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    相关资源
    最近更新 更多