mysql_affected_rows来确定查询的类型

时间:2014-09-08 12:37:10

标签: php mysql

我的php代码中有一个实用程序类,它为一些mysql函数提供了包装器。名为query()的函数之一接受查询字符串作为参数,然后执行该查询。 在此查询函数中,我想查明给定查询是否是数据状态更改查询(UPDATE/INSERT/DELETE etc.)或简单数据提取查询(SHOW/SELECT)

我计划使用mysql_affected_rows函数,因为php手册说明了这个函数"通过last INSERT, UPDATE, REPLACE or DELETE query"获取受影响的行数。

我假设我会为SELECT查询得到0或null。我知道即使那些没有进行任何修改的UPDATE/DELETE查询也会返回0,但从我的代码角度看它是可以的,因为我只想识别那些实际进行了一些数据修改的查询。

但是当我实际执行代码时,mysql_affected_rows会返回SELECT查询所选行的数量。

这是预期的行为吗?我查阅了php手册,但是他们没有详细说明SELECT查询时mysql_affected_rows的行为。

我查了一下MySql文档,它说MySql mysql_affected_rows函数应该像mysql_num_rows一样工作(这与我看到的行为一致)。

那么有没有其他的php函数可以帮助我识别查询类型而不实际解析查询?

2 个答案:

答案 0 :(得分:0)

也许你尝试过于复杂,字符串解析并不是最糟糕的想法。

或者你知道任何查询不是从它正在做的事情开始的吗?

mysql_query无论如何>多个查询不可用

public function query($query) {
    $state = null;

    if (stripos(trim($query), 'INSERT') === 0) {
        $state = 'insert';
    }
    elseif (stripos(trim($query), 'REPLACE') === 0) {

    }
    elseif (stripos(trim($query), 'UPDATE') === 0) {

    }
    elseif (stripos(trim($query), 'SELECT') === 0) {
        $state = 'select';
    }
    elseif (stripos(trim($query), 'SET') === 0) {
        $state = 'option';
    }
    else {
        $state = '?';
    }

    /* ... */
}

答案 1 :(得分:0)

为什么不提取函数查询接收到的sql(字符串)的第一个单词并对操作执行比较条件

$sql = 'select * from tableName';
$action = explode(' ',trim($sql))[0];
$action = strtoupper($action);

if($action=='UPDATE' || $action == 'INSERT' || $action=='DELETE'){
    //do your stuff here
}else{
    //it's a show/select query.
}

ps:这不是一个工作/测试过的代码。只是一个例子来更好地解释我在说什么。