我有一部分代码应该在表单中输入数据,将其存储在数组中然后将其输入数据库。我在$ 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行的值计数
答案 0 :(得分:1)
准备好的陈述与复制和粘贴不同!
INSERT INTO `personnel` (:fields) VALUES (:data)
你告诉PDO / MySQL,你想要将一个数据(:data
)恰好插入一个字段(:field
)。值为一个包含逗号的字符串,而不是以逗号分隔的多个值。
此外,您只能绑定数据,而不能绑定字段名称等结构信息。您必须创建如下查询:
INSERT INTO `personnel` (foo, bar, baz) VALUES (?, ?, ?)
然后将数据分别绑定到三个占位符。
答案 1 :(得分: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
方法,请参阅example #2。