You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:24:39