由于带有动态 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 异常导致的致命错误的主要内容,如果未能解决你的问题,请参考以下文章