Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 关于使用PDO组合查询的几个问题_Php_Sql_Pdo_Placeholder - Fatal编程技术网

Php 关于使用PDO组合查询的几个问题

Php 关于使用PDO组合查询的几个问题,php,sql,pdo,placeholder,Php,Sql,Pdo,Placeholder,关于在pdo中查询,我有两个问题,1st:哪种占位符类型更适合在pdo中使用,例如比较: $stmt = $db->prepare('SELECT model FROM cars WHERE brand = :brand'); $stmt->bindValue(':brand', $brand, PDO::PARAM_STR); $stmt->execute(); 这是: $stmt = $db->prepare('SELECT model FROM cars WHER

关于在pdo中查询,我有两个问题,1st:哪种占位符类型更适合在pdo中使用,例如比较:

$stmt = $db->prepare('SELECT model FROM cars WHERE brand = :brand');
$stmt->bindValue(':brand', $brand, PDO::PARAM_STR);
$stmt->execute();
这是:

$stmt = $db->prepare('SELECT model FROM cars WHERE brand = ?');
$stmt->bindValue(1, $brand, PDO::PARAM_STR);
$stmt->execute();
并且允许在同一查询中使用两种类型的占位符


2nd:如果我愿意使用一些函数来编写一个通用查询,比如:

public function genQuery($qType, qFieldsArray, qTablesArray, qWhereArray, qOrderArray, qGroupArray){
    switch($type){
        case 'select';
          //Call to slctFunction
          break;
        case 'update';
          //Call to updtFunction
          break;
        //**etc..
}
如果我错了,请更正,但只要我在
slctFunction
updtFunction
等中分别绑定用户输入数据的值。。如果不直接将它们注入到查询中,那么我就不会使它容易受到sql注入的攻击,对吗


提前感谢问题1:您可以使用命名参数或编号参数,但不能在同一语句中同时使用这两种参数。发件人:

不能在同一SQL语句中同时使用命名参数标记和问号参数标记;选择一个或另一个参数样式

我认为命名参数更好,因为它们是自文档化的,如果您更新查询以添加更多参数,它们不会受到影响


问题2:您是对的,使用绑定参数而不是在查询中插入值可以防止SQL注入。

第一个问题毫无意义。没有“更好”的方法。每一种都适合自己使用。位置占位符是必不可少的,因为它们可以使代码不那么臃肿,而不是将每个字段名写十几次。 命名是好的,因为具有相同名称的多个占位符可以仅绑定到单个变量。 顺便说一句,后一种方法是考虑到您可以在execute中只传递整个$\u POST数组的情况。在这种情况下,命名占位符可以缩短代码。但是通常情况下,数组键是手工编写的,比如

$sql  = "SELECT * FROM table WHERE field1=:foo AND field2=:baz";
$data = DB::getAll($sql, array('foo'=>$foo, 'baz'=>$baz));
它们毫无意义,必须按原样书写

$sql  = "SELECT * FROM table WHERE field1=? AND field2=?";
$data = DB::getAll($sql, array($foo, $baz));
使您的代码干燥

要回答你是否可以混合使用它们——老实说,你可以试着自己在几秒钟内看到它

第二个更好。然而,你的一些前提是坏的

只要我绑定用户输入的值数据

你错了。
数据源上不应存在分离。这是非常重要的安全原则:不仅是臭名昭著和含糊不清的“用户输入”,而且是每一个值。每个进入查询的值都必须硬编码或用占位符替换。没有例外

这也使得您的通用函数不安全。更不用说这样一个函数的想法被设计破坏了。你为什么想要它?让你自己说两句话?你得到了什么回报?从宝贵的SQL和束缚你自己的枷锁中产生的一种模糊的。使用此函数的示例有哪些?你有没有试着去看他们的行动?您是否尝试将它们与regulart SQL进行比较

那么关节、插入延迟等查询呢?您打算用PHP编写完整的SQL方言吗


对于非常简单的查询,您应该使用ORM。它将使您的代码确实简短,但仍然可读。但看在上帝的份上,放弃这样一个建设者的想法。

我可以知道为什么这个问题被否决了吗?