PHP MySQLi准备好的语句在不应该查找结果的时候

问题描述 投票:1回答:1

我有两个数据库

数据库1:作业->使用自动增量ID

数据库2:CompletedJobs->使用Guid作为ID

我的程序中有一个报告页面,该页面将从Jobs表中获取一个jobId并显示该报告。我当前正在扩展此功能,以便jobId也可以成为Guid

代码进行检查以查看jobId是否为有效的guid,如果不是,则将检查JobId是否为来自Job表的ID

我发现的是,如果我输入66A之类的内容。它可以说出它不是有效的GUID,但是会在作业表中找到记录66

您可以在此sqlfiddler中看到此行为:http://sqlfiddle.com/#!9/a593d8/5

我的问题是我需要找到一种方法来防止在搜索中出现此怪癖。

下面是我准备好的用于Job表的语句代码

if (!($stmt = $this->conn->prepare("SELECT * FROM job WHERE _id = ? AND exported = 0"))) {
        echo "Prepare failed: (" . $this->conn->errno . ") " . $this->conn->error;
        $this->CloseStmtConnection($stmt);
    }

    if (!$stmt->bind_param("i", $id)){
        echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;

        $this->CloseStmtConnection($stmt);
    }

    if (!$stmt->execute()) {
        echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;

        $this->CloseStmtConnection($stmt);
    }

    $results = $stmt->get_result();

任何想法都会很棒,我曾尝试使用LIKEBINARY,但想法不多了

php mysql mysqli
1个回答
0
投票

问题是隐式转换。大概id是一个数字,您正尝试将其与字符串('66A')进行比较。

[发生这种情况时,MySQL将字符串转换为数字以进行比较:由于'66A'以数字开头,因此将其转换为66。如果它不是以数字开头(例如'A66'),它将被转换为0

您可以通过在字符串上下文中强制进行比较来解决此问题:

select * from test where cast(id as char) = '66A';
© www.soinside.com 2019 - 2024. All rights reserved.