PDO 案例存在不适用于绑定参数

Posted

技术标签:

【中文标题】PDO 案例存在不适用于绑定参数【英文标题】:PDO case exist not working with bind parameters 【发布时间】:2019-10-31 06:31:34 【问题描述】:

我正在检查任一表中是否存在用户名和密码组合?

我在 PDO 中使用绑定参数执行此操作。页面执行时显示错误:currently unable to handle this request.

这是我的代码:

    $stmtus = $conn->prepare("Select
                case
                when exists (
                Select 1 from School_Profile 
                where aes_decrypt(SchoolEmail, 'SALT') = :Username  and password = :Password
                ) then 'Admin'
                when exists (
                Select 1 from NonAdminUsers 
                where aes_decrypt(Nuser, 'SALT') = :Username and Npassword = :Password
                ) then 'Non Admin'
                else 'Unknown'
                end result");
 $stmtus->bindParam(':Username', $username);
 $stmtus->bindParam(':Password', $password);
 $username = htmlspecialchars($_POST['username'], ENT_QUOTES, 'UTF-8');
 $password = htmlspecialchars($_POST['password'], ENT_QUOTES, 'UTF-8');
 $stmtus -> execute();

我的错误日志显示:

php Fatal error: Uncaught Error: Call to a member function prepare() on null in

【问题讨论】:

不要对进入数据库的数据使用htmlspecialchars。这会在以后给你带来麻烦。仅在 HTML 上下文中输出时使用 htmlspecialchars @Dharman。谢谢你的建议。我会改变它。你能告诉我我可能会遇到什么类型的问题吗? 如果您想将数据输出到其他介质怎么办?如果你想搜索数据库中的数据怎么办?如果您想修改保存的信息怎么办。如果您的数据已针对 HTML 进行了预格式化,则不能这样做 您能告诉我们您是如何打开 PDO 连接的吗? 【参考方案1】:

据我所知,您不能多次重复使用命名参数,这可能是您的错误的根源。因此,为了快速解决问题,请不要两次或多次使用相同的参数:

$stmtus = $conn->prepare("SELECT
    CASE WHEN EXISTS (
             SELECT 1 FROM School_Profile
             WHERE AES_DECRYPT(SchoolEmail, 'SALT') = :user1 AND password = :pass1)
         THEN 'Admin'
         WHEN EXISTS (
             SELECT 1 FROM NonAdminUsers
             WHERE AES_DECRYPT(Nuser, 'SALT') = :user2 AND Npassword = :pass2)
         THEN 'Non Admin'
         ELSE 'Unknown'
         END result");

$stmtus->bindParam(':user1', $username);
$stmtus->bindParam(':pass1', $password);
$stmtus->bindParam(':user2', $username);
$stmtus->bindParam(':pass2', $password);
$username = htmlspecialchars($_POST['username'], ENT_QUOTES, 'UTF-8');
$password = htmlspecialchars($_POST['password'], ENT_QUOTES, 'UTF-8');
$stmtus->execute();

【讨论】:

以上是关于PDO 案例存在不适用于绑定参数的主要内容,如果未能解决你的问题,请参考以下文章

pdo-odbc 不适用于绑定值,nvarchar 和 text 在等于运算符中不兼容

PDO 的 rowCount() 不适用于 PHP 5.2.6+

Xamarin.UWP 自定义 ViewCell 存在绑定问题

lastInsertId() 在插入操作中不适用于 PDO 对象[关闭]

Php pdo rollBack() 不适用于更新语句

为啥这种“嵌套连接”适用于 PDO 而不适用于 MySql cli?