1

问候溢出的同胞,

我正在使用 PHP PDO 语句和 MySQL。我有一个安全的管理表单,允许管理员输入 MySQL 查询的后半部分,然后将其保存到数据库中。例如查询的第一部分是:

SELECT COUNT(1) AS count, SUM(`url_count`) AS total 
FROM `table_name` WHERE `tablekey_id` = 1

并且用户可以将以下内容保存到sql_count列中的数据库中:

AND `row_is_live` = 1 AND `title` > '';

因此,在我的程序中,我想执行查询,但是作为用户输入,查询可能会失败。所以我想测试一下查询是否会失败,如果会失败,那么我想做其他事情以免停止我的程序。

这是我正在使用的代码。我目前正在尝试一个 try catch 块,但它会停止代码的执行。

$table = new PatternsGenerator($baseDomain, true);
$sectionRowsQuery = $db->getTopLevelPatternRows($sectionId);
$returnArray = array();
$index = 1;

while ($row = $sectionRowsQuery->fetch()) {
    if(isset($row['sql_count']) && strlen($row['sql_count']) > 0) {
        try {
            $counts = $db->getCountsWithStoredQuery($row['sql_count']);
            throw new Exception("This is an exception");
        } catch (Exception $e) {
            $counts = array('total' => 1, 'count' => 0);
        }
    } else {
        $counts = array('total' => 0, 'count' => 0);
    }

    $table->getTopLevelRow_1($returnArray, $row['title'], $counts, $row['id'], $index);
    $index++;
}

... more code ....

我的问题是,如何在不停止执行其余代码的情况下测试 MySQL 查询以查看它是否会失败?请和谢谢大家。


编辑:

好的,我发现了问题。函数 getCountsWithStoredQuery($storedQuery) 试图 fetchAll()。因此,如果查询失败,则在其上执行 fetchAll() 并且程序失败。我只需将 fetchAll() 移动到 try 块,以便在查询成功完成后执行。

感谢所有认真对待这个问题的人。

4

1 回答 1

0

事实上,多标准搜索以及因此有条件地创建的查询在 Web 开发中是一项非常微不足道的任务。

所以,你最好遵循这种通用的方式,而不是走危险的弯路,让用户自由地做任何 SQL 注入。

创建一系列条件,根据用户的选择添加查询部分并不是什么大问题。

但首先你需要明白

  • 没有查询一定会失败
  • 不允许用户在查询中注入 SQL
于 2013-04-19T19:48:14.143 回答