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

问题描述 投票:1回答:2

首先,我很抱歉在其他地方回答了这个问题,但是我什么都找不到。

我对以下代码有疑问:

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

所有东西都像一个咒语,所以我想问题出在我如何将数据传递给占位符。

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

预先感谢您的帮助。

php arrays pdo placeholder implode
2个回答
1
投票

事实上,确实已经在PDO tag wiki中得到了答复。

但是,标记Wiki永远不会在此网站上发布给任何人-因此,这不是您的错。无论如何,您都可以从那里使用解决方案。

虽然解释很简单:您不能绑定任意查询部分,但仅单个数据文字。因此,您实际上必须具有更复杂的代码,才能动态创建查询。字段名称根本无法绑定-因此,必须手动进行formattedwhitelisted。而对于数据部分,您必须使用占位符创建一个字符串,然后绑定您的数据。

此外,我想您的代码中使用的所有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数组时。如果它原样来自客户端,则必须首先将其列入白名单)


0
投票

错误的估计格式和变量$ data con lafunciónimplode(),详细说明:

公共函数insert($ obj){ 尝试{ $ this-> fields =“ " . implode("", array_keys($obj)) . "”; $ this-> data =“:”。implode(“,:”,array_keys($ obj)); $ this-> sql =“ INSERT INTO {$ this-> table}({$ this-> fields}) VALUES({$ this-> data})“; $ query = $ this-> db-> prepare($ this-> sql); 如果($ obj!= null){ foreach($ obj as $ key => $ value){ if(empty($ value)){ $ value = NULL; } $ query-> bindValue(“:$ key”,$ value); } $ query-> execute(); } } catch(Exception $ e){ echo $ e-> getMessage(); }}

Espero te Sirva。

© www.soinside.com 2019 - 2024. All rights reserved.