PHP PDO - 将查询占位符传递和内爆数组

时间:2013-08-21 09:50:52

标签: php arrays pdo placeholder implode

首先,如果在其他地方得到回答,我道歉,但我找不到任何东西。

我遇到以下代码问题:

function register_user ($register_data) {
    global $db;
    array_walk ($register_data, 'array_sanitize');
    $register_data ['password'] = md5 ($register_data ['password']); 

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

    $query = $db -> prepare ("INSERT INTO `users` (:fields) VALUES (:data)");
    $query -> bindParam (':fields', $fields);
    $query -> bindParam (':data', $data);
    $query -> execute ();
}

问题是这是正确执行的,但是没有运行查询,并且没有在数据库中插入行。

现在,如果我这样做:

$query = $db -> prepare ("INSERT INTO `users` ($fields) VALUES ($data)");
//$query -> bindParam (':fields', $fields);
//$query -> bindParam (':data', $data);
$query -> execute ();

一切都像魅力一样,所以我猜测问题在于我如何将数据传递给占位符。

有人可以向我解释为什么这不起作用?我想首先理解它。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

事实上,在PDO tag wiki

中确实已经回答了

但是,标签wiki从未在此网站上向任何人公布 - 因此,这不是您的错。无论如何,你可以从那里使用解决方案。

虽然解释很简单:您不能绑定任意查询部分,但仅限单个数据文字
因此,您必须实际拥有更复杂的代码,以动态创建查询。字段名称根本无法绑定 - 因此,必须手动格式化列入白名单。对于数据部分,您必须使用占位符创建字符串,然后绑定数据。

另外,我认为你的代码中使用的array_walk'array_sanitize'函数是无用的和/或有害的。

此外,无论如何都会得到一个标准注释:未加盐的MD5被视为弱哈希。使用一些更强大的算法

还有一点广告。使用我的safeMysql库,您可以将register_user函数的代码放在一行:

function register_user ($register_data) {
    global $db;
    $db->query("INSERT INTO `users` SET ?u", $register_data);
}

(但是,只有手动构建$ register_data数组。如果它来自客户端,则必须先将其列入白名单)