由于带有动态 PHP 输入的 SQL 查询导致的 PDO 异常导致的致命错误

Posted

技术标签:

【中文标题】由于带有动态 PHP 输入的 SQL 查询导致的 PDO 异常导致的致命错误【英文标题】:Fatal Error due to PDO Exception because of a SQL query with dynamic PHP input 【发布时间】:2019-04-02 08:17:56 【问题描述】:

经过将近一天的研究,我无法真正看出我的代码有什么错误。我正在尝试创建一个返回查询结果行数的小型原型函数。

我得到的错误是:Uncaught PDOException: SQLSTATE[42000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The multi-part identifier "my@email.com" could not be bound. in C:\inetpub\wwwroot\index.php:59

第 59 行是 $stmt->execute();

我相信问题来自我的 SQL 查询,但我不是 100% 确定。

代码的工作方式是从 POST 输入中获取值,并检查行和列是否包含架构中的所述值。

此外,我正在使用 MSSQL(不是 mysqli)和 PHP 来完成这项任务。


这是我希望 php 代码发送 SQL 查询并检查结果是否存在的主要部分。

<?php  
    include "connect.php";

    if(isset($_POST['login']))
    
        $email = $_POST['EMAIL'];
        $password = $_POST['PASSWORD']; 

        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $stmt = $conn->prepare("SELECT * FROM users WHERE EMAIL=$email;"); 
        $stmt->execute();

        $count= $stmt->rowCount();
        echo "Row count: $count \n";
    
?> 

顺便提一下,我已经尝试了对 SQL 查询的各种更改,例如:

$stmt = $conn->prepare("SELECT * FROM users WHERE EMAIL='".$email."';");

$stmt = $conn->prepare("SELECT * FROM users WHERE EMAIL=?;");

使用包含 $email 的数组输入。

全部返回相同的错误。


这里有connect.php,以防万一问题来自这里。

<?php 
        $servername = "localhost";
        $username = "sa";
        $password = ""; 

        try 
        
            $conn = new PDO("sqlsrv:Server=$servername; Database=db", $username, $password);
            // set the PDO error mode to exception
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            echo "Connected!";
            return $conn;
        

        catch(PDOException $e)
        
            echo "Connection failed: " . $e->getMessage();
        
?>

【问题讨论】:

@B001ᛦ 亲爱的,我很抱歉。 Incorrect syntax near 究竟是什么? 对不起@u_mulder,我不小心粘贴了错误的错误日志。现在它固定在上面的行中。 当时我正在尝试查看问题是否与输入类型有关,但我认为不是。 $email 是一个 string 值,应该被引用。或者使用准备好的语句。 【参考方案1】:

基本上我解决问题的方法是将EMAILPASSWORD 转换为VARCHAR 的:

$stmt = $conn->prepare("SELECT ID, EMAIL, LAST_NAME FROM users WHERE CONVERT(VARCHAR, EMAIL)='my@email.com' AND CONVERT(VARCHAR, PASSWORD)='1234'");  

【讨论】:

以上是关于由于带有动态 PHP 输入的 SQL 查询导致的 PDO 异常导致的致命错误的主要内容,如果未能解决你的问题,请参考以下文章

将sql查询存储在列表中时PHP内存耗尽

带有 IN 子句的 SQL 查询的 MYSQL 查询优化

php 执行mysql中查询时内存溢出怎么办

带有 sql 转义的动态 mysql 查询是不是与准备好的语句一样安全?

如何动态准备 SQL 查询(也包括列名)避免 SQL 注入

由于 SET 语句导致 SQL 查询失败 [关闭]