1. 问题:
我使用DELETE语句删除数据的时候,如果引号内两侧不留空的时候,删除就不会执行,比如,下面这样就可以成功从数据库中删除:delpsqlf="DELETEFROMdatatable WHERE sid = sid";DB::query(delpsqlf);而下面这样,显示已执行,但数据库中的数据并未删除,数据库也无报错:delpsqlf="DELETEFROMdatatable WHERE sid = sid";DB::query(delpsqlf);
2. 千问的回答:
针对上述问题,我将discuz_database.php发给千问,给的结果为:
通过分析您提供的PHP类代码,我发现问题出在Discuz框架的SQL安全检查机制上。让我为您详细解释:
问题根源
问题主要出现在discuz_database_safecheck::checkquery()方法中,这个方法负责SQL语句的安全检查。关键代码如下:
$cmd = strtoupper(substr(trim($sql), 0, 3));if(isset(self::$checkcmd)) { $check = self::_do_query_safe($sql);}
这里self::$checkcmd定义为:
protected static $checkcmd = array('SEL'=>1, 'UPD'=>1, 'INS'=>1, 'REP'=>1, 'DEL'=>1);
具体分析
当SQL语句有前后空格时(" DELETE FROM table WHERE sid = sid"):trim(sql)会移除前后空格,得到"DELETE FROM table WHERE sid = sid"substr(trim(sql), 0, 3)返回"DEL""DEL"在checkcmd数