Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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_Mysql_Pdo_Try Catch - Fatal编程技术网

Php 测试PDO查询,如果失败,请执行其他操作

Php 测试PDO查询,如果失败,请执行其他操作,php,mysql,pdo,try-catch,Php,Mysql,Pdo,Try Catch,各位飞越者问候 我正在使用PHP PDO语句和MySQL。我有一个安全的管理员表单,允许管理员输入MySQL查询的后半部分,然后保存到数据库中。例如,查询的第一部分是: SELECT COUNT(1) AS count, SUM(`url_count`) AS total FROM `table_name` WHERE `tablekey_id` = 1 用户可以将以下内容保存到sql_count列中的数据库中: 因此,在我的程序中,我希望执行查询,但是如果用户输入了查询,查询可能会失败。因

各位飞越者问候

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

SELECT COUNT(1) AS count, SUM(`url_count`) AS total 
FROM `table_name` WHERE `tablekey_id` = 1
用户可以将以下内容保存到sql_count列中的数据库中:

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

这是我正在使用的代码。我当前正在尝试一个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移动到try块,以便在查询成功完成后执行


谢谢大家认真对待这个问题

事实上,多条件搜索和有条件创建的查询在web开发中是一项非常简单的任务

因此,您最好遵循这种常规方法,而不是走危险的弯路,让用户自由地执行SQL注入

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

但首先你需要明白这一点

任何查询都不一定要失败 不允许任何用户在查询中插入SQL
如果用户正在输入它的一部分,它可以。这是防御性编程。这是项目的要求。我没有选择我正在为其他人编程的项目需求。现有的许多项目并不理想。我正在尽可能防御性地对其进行编程,以处理错误。在我的问题中,我问的是如何做一些事情。如果你不知道怎么做,那很好,但请不要发表尖刻的评论。谢谢。@dianuj谢谢,我正在尝试try-catch块,但它会停止执行。我正在试图找到一种方法,如果它碰到了catch块,就继续执行。你说停止执行是什么意思?p、 这个问题不应该得到-1.$pdo->setAttributePDO::ATTR_ERRMODE,pdo::ERRMODE_异常;将使PDO抛出异常-然后只需将查询调用包装在一个try-catch中。不过,您应该有一个sanitiser/regex来检查它们的输入,因此例如,DROP命令是不允许的。使用相同的sanitiser/regex,您可以使用它来构建有效、安全的查询?它是通过一个表单创建的,该表单允许它们选择列、运算符和连接and、OR语句。另外,如果你阅读了这个问题,你会注意到它在程序的管理部分,是项目的一个要求。谢谢你的回答,尽管这对我完成这个要求没有帮助。这是一个你没有运用常识的解决方案吗:
$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 ....