0

我有一部分代码应该将数据输入到表单中,将其存储在数组中,然后将其输入数据库。我在 $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 行的值计数不匹配)

4

2 回答 2

1

准备好的语句不等于复制粘贴!

INSERT INTO `personnel` (:fields) VALUES (:data)

您在这里告诉 PDO/MySQL 您想将一条数据 ( :data) 插入到一个字段 ( :field) 中。该值是一个包含逗号的字符串,而不是由逗号分隔的多个值。

此外,您只能绑定数据,不能绑定字段名称等结构信息。您必须像这样创建一个查询:

INSERT INTO `personnel` (foo, bar, baz) VALUES (?, ?, ?)

然后分别将数据绑定到三个占位符上。

于 2013-07-04T16:48:59.403 回答
0

你不能这样做:

  • 您需要单独添加每个变量/字段名称和值;
  • 您只能绑定值,而不能绑定表名或字段名。

您必须将表名和字段名直接注入到您的 sql 中,因此为防止 sql 注入问题,您需要在执行此操作之前根据白名单检查它们。

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

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

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

于 2013-07-04T16:50:21.813 回答