【问题标题】:Send array from js to php to SQL database将数组从 js 发送到 php 到 SQL 数据库
【发布时间】:2020-05-21 22:02:45
【问题描述】:

我希望我在这里遗漏了一些简单的东西。

我在 js 中创建了一个数组,比如:var ids = [1,2,3,4,5];

现在我希望这个数组在我的 SQL 数据库表中填充一列。

我有这样的管道设置,用于将单个元素添加到我的表中:

  1. 请求通过 ajax 发送:
$.ajax({
  type: "POST",
  url: "some.php",
  data: {
    ids: ids,
  }
});
  1. some.php接收数据(连接等已建立):

$ids = $_POST['ids'];

  1. SQL 用于向列 COL_ID 插入单个值
$sql = "INSERT INTO `mydb`.`dbtable`(`COL_ID`) VALUES ('$ids)";

此管道适用于单个值(例如 ids = 2,但不适用于数组。

我想要COL_ID 将每个数组元素包含为一行

| COL_ID    |
|--------   |
| 1         |
| 2         |
| 3         |
| 4         |
| 5         |

我怀疑它在 SQL 查询中。欢迎任何帮助。

【问题讨论】:

    标签: php jquery sql


    【解决方案1】:

    首先,使用准备好的语句,不要将发布数据直接插入到数据库查询中。直接使用 post 数据意味着您容易受到 sql 注入攻击。

    正如@DanielReed 指出的,正确的格式是

    INSERT INTO table_name (column_list) VALUES (value_list_1), (value_list_2), (value_list_3);
    

    您可以动态构建它:

    $ids = $_POST['ids'];
    // Make sure we get the correct number of ? for prepared statements
    $params = str_repeat('(?), ', count($ids));
    // Strip the trailing space and comma
    $params = substr($params, 0, -2);
    
    $sql = 'INSERT INTO `mydb`.`dbtable`(`COL_ID`) VALUES ' . $params;
    

    现在您可以使用 $sql 作为查询,使用 $ids 作为准备好的语句的值。这样可以防止 sql 注入。

    【讨论】:

    • 谢谢。抱歉这个问题:如果我在mysqli_query($con,$sql) 中使用$sql 作为我的查询,我在哪里指定它应该使用$ids?也许我误解了“使用 ... $ids 作为准备好的语句的值”的意思。
    • 您可以使用mysqli_prepare($con, $sql);,然后使用mysqli_stmt_bind_param(...)。示例见手册:php.net/manual/en/mysqli-stmt.bind-param.php
    • 这是一个比我更好的答案。 @ben_aaron 您应该始终使用他所说的绑定值,否则人们可以对您执行 SQL 注入攻击。
    【解决方案2】:

    PHP 将其作为数组接收。

    SQL 语法希望它采用以下语法:

    INSERT INTO table_name (column_list)
    VALUES
        (value_list_1),
        (value_list_2),
        ...
        (value_list_n);
    

    所以你可以做的是:

    $sql = "INSERT INTO `mydb`.`dbtable`(`COL_ID`) ";
    foreach($ids as $value){
         $sql .= "(".$value.") ";
    }
    

    【讨论】:

    • 谢谢。如果我理解正确,这会创建多个 $sql (每次运行一个)。我会在哪里进行查询,例如mysqli_query($con,$sql)?
    • 是的,所以 .= 表示连接。它几乎将其附加到字符串的末尾。所以如果你说 $str = "Hello"; $str .= "我的名字是"; $str .= "丹尼尔"; --- $str 的值将是“Hello My name is Daniel”。因此,您将运行与您在评论中提到的相同的查询。您可能必须在括号后添加一个空格,因为它只是将它们连接在一起,我将编辑我的答案以添加它。
    • 哦,他们也需要在每个逗号后面加上逗号,所以如果不调整我的答案就不会工作
    猜你喜欢
    • 2019-04-19
    • 2019-04-05
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    相关资源
    最近更新 更多