如何使用php将array as key=>value和string value插入sql

xzv2uavs  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(368)

**结束。**此问题不符合堆栈溢出准则。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

11个月前关门了。
改进这个问题

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);
 }

我对name数组有一个小问题,当我执行上面的代码时,每行的成员值都取
我得到了什么

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

我想要的是这个

member
-----
name1
name2
name3
name4

注意:其他每一列都被完美地插入,稍后我将考虑sql注入安全性。

w8ntj3qf

w8ntj3qf1#

我想你只需要保持 $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');
    }
}

我知道你说过你以后会担心逃避,但我只是把它换成了一份事先准备好的声明,因为这对每个人来说都更容易准备好。

相关问题