PHP:IF语句中使用OR调用exists函数时逻辑失效的修复求助
嘿,我帮你找到了问题的根源,主要有两个地方需要调整,咱们一步步来:
核心问题:SQL语句存在语法错误
你的exists函数在拼接SQL时,没有给字符串类型的$value添加引号,这会导致当$value是字符串(比如你的$generate_hash)时,数据库直接报错,进而让exists函数返回错误的结果。举个例子,当$where是hash、$value是abc123时,生成的SQL是:
SELECT * FROM vouchers WHERE hash=abc123
数据库会把abc123当成字段名而不是字符串值,自然查不出正确结果,甚至直接抛出语法错误。
修复exists函数
我们需要给字符串类型的参数加引号,同时做转义避免SQL注入,还要增加查询失败的判断:
function exists($table,$where,$value){ global $db; // 区分字符串和数字,给字符串加引号并转义 $escaped_value = is_string($value) ? "'" . $db->escape_string($value) . "'" : $value; $query = $db->query("SELECT * FROM {$table} WHERE {$where} = {$escaped_value}"); // 先检查查询是否成功,再判断行数 if(!$query || $query->num_rows == 0) { return false; }else{ return true; } }
可选调整:逻辑运算符可能不符合需求
你的判断条件是!exists(...) OR !exists(...),这个逻辑等价于!(exists(...) AND exists(...)),意思是只要v_id不存在,或者hash不存在,就执行操作。
如果你实际需求是只有当v_id和hash都不存在时才执行操作,那得把OR改成AND:
if(!exists('vouchers','v_id',$generate_id) AND !exists('vouchers','hash',$generate_hash)) { //执行操作 }
要是你的需求本来就是“只要其中一个不存在就执行”,那逻辑没问题,只需要修复上面的SQL问题就行。
额外推荐:用预处理语句更安全
直接拼接SQL有SQL注入风险,推荐用预处理语句重构exists函数,彻底避免引号和注入问题:
function exists($table,$where,$value){ global $db; $stmt = $db->prepare("SELECT * FROM {$table} WHERE {$where} = ?"); // 根据参数类型绑定,s代表字符串,i代表整数 $param_type = is_string($value) ? "s" : "i"; $stmt->bind_param($param_type, $value); $stmt->execute(); $result = $stmt->get_result(); // 行数大于0则返回true,否则false return $result->num_rows > 0; }
内容的提问来源于stack exchange,提问作者Dani Prime
相关产品推荐
相关产品推荐

