php - 在 MySQL 中选择多个表阻止我使用 <= 表达式

标签 php mysql pdo

我正在使用 SELECT像这样的查询:

SELECT knowledge.*, 
       sortflagitems.* 
FROM   knowledge, 
       sortflagitems 
WHERE  sortflagitems.flagid = :FlagID 
       AND knowledge.id = sortflagitems.kid 
       AND sortflagitems.cid = :CID 
       AND knowledge.archived = :Nothing 
       AND sortflagitems.flagdate <= :Now 
ORDER  BY sortflagitems.sortorder 

这会产生此错误:

 Invalid parameter number: number of bound variables does not match number of tokens

但是如果我更改 SELECT查询到此:

SELECT knowledge.*, 
       sortflagitems.* 
FROM   knowledge, 
       sortflagitems 
WHERE  sortflagitems.flagid = :FlagID 
       AND knowledge.id = sortflagitems.kid 
       AND sortflagitems.cid = :CID 
       AND knowledge.archived = :Nothing 
       AND sortflagitems.flagdate = :Now 
ORDER  BY sortflagitems.sortorder 

这不会产生任何错误

请注意这一行 SortFlagItems.FlagDate=:Now更改自SortFlagItems.FlagDate<=:Now

我唯一的理论是,由于某种原因,当您选择多个表时,您不能使用 <=运算符(请注意,使用 < 运算符会产生相同的错误)?我想不出其他的了..

<小时/>

这是完整的 PHP 代码:

$DBParams = array('FlagID'=>$_GET['flag'], 'CID'=>$row['CatID'], 'Nothing'=>0, 'Now'=>strtotime('now'));
$results = $Db->rquery('
                    SELECT Knowledge.*, SortFlagItems.*
            FROM Knowledge, SortFlagItems
            WHERE SortFlagItems.FlagID=:FlagID
            AND Knowledge.id = SortFlagItems.KID
            AND SortFlagItems.CID=:CID
            AND Knowledge.Archived=:Nothing
            AND SortFlagItems.FlagDate<=:Now
            ORDER BY SortFlagItems.SortOrder', $DBParams);

这是 rquery功能:

function rquery($query, $params = NULL) {
    $this->_query = filter_var($query, FILTER_SANITIZE_STRING);
    $stmt = $this->_prepareQuery();
    $stmt->execute($params);

    $results = $this->_dynamicBindResults($stmt);

    return $results;
}

和构造函数:

public function __construct($host, $username, $password, $db) {
    $this->_mysql = new PDO("mysql:host=$host;dbname=$db", $username, $password);
    $this->_mysql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}

最佳答案

我的解决方案是从您的方法中删除filter_var:

function rquery($query, $params = NULL) {
    $this->_query = $query;
    $stmt = $this->_prepareQuery();
    $stmt->execute($params);

    $results = $this->_dynamicBindResults($stmt);

    return $results;
}

该绑定(bind)将阻止您进行 SQL 注入(inject)。
如果需要,您可以在 _dynamicBindResults 内的参数上使用 filter_var()

或者您可以在传递查询之前在每个参数上使用它:

$DBParams = array('FlagID'=>filter_var($_GET['flag'], FILTER_SANITIZE_STRING),...);

这里的连接是显式连接:

SELECT Knowledge.*, SortFlagItems.*
FROM Knowledge
INNER JOIN SortFlagItems ON Knowledge.id = SortFlagItems.KID
WHERE SortFlagItems.FlagID=:FlagID
AND SortFlagItems.CID=:CID
AND Knowledge.Archived=:Nothing
AND SortFlagItems.FlagDate<=:Now
ORDER BY SortFlagItems.SortOrder

关于php - 在 MySQL 中选择多个表阻止我使用 <= 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15144457/

相关文章:

php - xml:lang 在 PHP 中解析

php - 如何在 laravel 5.1 队列中使用除默认值之外的其他 QUEUE_DRIVER?

MySQL - 基于子查询更新值

PHP 读取文件与 MySql 查询

php - 违反完整性约束 : 1052 Column 'id' in where clause is ambiguous

php - ZF2 - MySQL PDO 连接错误 : could not find driver

php - 使用 php 和 mysql 数据库返回对话列表以及每条消息的最后一条消息

php - 帮助实现过去日期验证

mysql - 如何 Access MS Access *.adp 文件中的 SQL 数据库?

php - 将数组插入数据库