我的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函数可以帮助我识别查询类型而不实际解析查询?
答案 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:这不是一个工作/测试过的代码。只是一个例子来更好地解释我在说什么。