Php 插入数组-PDO

Php 插入数组-PDO,php,pdo,Php,Pdo,我有一部分代码,用来获取表单中输入的数据,将其存储在数组中,然后将其输入数据库。我在$fields和$data上使用了var_dump,它们都返回在字段中输入的信息(在add_habbo函数中)。所以我遇到的问题是MYSQL/PDO代码没有将这些数据插入数据库 这是我用来将它们插入数据库的代码: $fields = '`' . implode('`, `', array_keys($habbo_data)) . '`'; $data = '\'' . implode('\',

我有一部分代码,用来获取表单中输入的数据,将其存储在数组中,然后将其输入数据库。我在$fields和$data上使用了var_dump,它们都返回在字段中输入的信息(在add_habbo函数中)。所以我遇到的问题是MYSQL/PDO代码没有将这些数据插入数据库

这是我用来将它们插入数据库的代码:

    $fields = '`' . implode('`, `', array_keys($habbo_data)) . '`';
    $data   = '\'' . implode('\', \'', $habbo_data) . '\'';

    var_dump($fields);
    var_dump($data);

    global $con;

    $query = "INSERT INTO `personnel` (:fields) VALUES (:data)";
    $result = $con->prepare($query);
    $result->bindParam(':fields', $fields, PDO::PARAM_STR);
    $result->bindParam(':data', $data, PDO::PARAM_STR);
    $result->execute();
我觉得它与bindParam部分有关,可能是PDO::PARAM_STR?谢谢你的帮助

更新:

$fields = '`' . implode('`, `', array_keys($habbo_data)) . '`';
$fields_data   = ':' . implode(', :', array_keys($habbo_data));

var_dump($fields);
var_dump($fields_data);

global $con;

$query = "INSERT INTO `personnel` (`rank`, `habbo_name`, `rating`, `asts`, `promotion_date`, `transfer_rank_received`, `cnl_trainings`, `rdc_grade`,
    `medals`, `branch`) VALUES ({$fields_data})";
$result = $con->prepare($query);
$result->execute($habbo_data);

$arr = $result->errorInfo();
print_r($arr);
错误:

数组([0]=>21S01[1]=>1136[2]=>列计数不匹配 第1行的值计数)


准备好的语句与复制粘贴不同

INSERT INTO `personnel` (:fields) VALUES (:data)
您在这里告诉PDO/MySQL,您希望将一段数据(
:data
)插入一个字段(
:field
)。该值是一个包含逗号的字符串,而不是由逗号分隔的多个值

此外,您只能绑定数据,而不能绑定字段名等结构信息。您必须创建如下查询:

INSERT INTO `personnel` (foo, bar, baz) VALUES (?, ?, ?)
然后分别将数据绑定到三个占位符。

您不能这样做:

  • 您需要分别添加每个变量/字段名和值
  • 只能绑定值,不能绑定表名或字段名
表名和字段名必须直接注入到sql中,因此为了防止sql注入问题,在执行此操作之前,需要对照白名单检查它们

因此,在您的情况下,这将类似于(草稿):


请注意,我不再手动绑定变量,而是将关联的
$habbo_data
数组作为参数直接发送到
execute
方法,请参见。

您是否尝试回显错误信息以查看错误的实际情况。但问题是没有正确绑定字段。您正在尝试将所有字段绑定到一个参数中,每个字段都必须有自己的参数您应该发布您使用的实际代码和实际输出,您当前的sql缺少逗号,并且列名周围没有反勾号。修复了这两个问题,已更新以包含代码和新的错误消息。我猜错误是这些值仍然作为一个字符串而不是单个字符串列出?为什么不使用我给你的示例?这样,字段和变量的数量将始终匹配。顺便说一句,修正了我答案中的一个错误。谢谢你的解释。我想它不会那么简单:P.我尝试了您提供的代码,但我使用errorinfo()得到了这个错误:Array([0]=>42000[1]=>1064[2]=>您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以获取正确的语法(列名)@user2547576您必须显示完整的查询,也许我在某个地方输入了一个错误。此外,我发布的只是一般的想法,取决于
$habbo_data
的数组键,这样做可能是不可能的。哎呀,我输入了一些错误。我在编辑主帖时遇到了新的错误。@jeroen是这种类型的insert PRESQL注入?
// assuming all fields have been checked against a whitelist
// also assuming that the array keys of `$habbo_data` do not contain funny stuff like spaces, etc.
$fields = '`' . implode('`, `', array_keys($habbo_data)) . '`';
$fields_data   = ':' . implode(', :', array_keys($habbo_data));

var_dump($fields);
var_dump($fields_data);

global $con;

$query = "INSERT INTO `personnel` ({$fields}) VALUES ({$fields_data})";
$result = $con->prepare($query);
$result->execute($habbo_data);