PHP中SQL查询中的多个参数

Posted

技术标签:

【中文标题】PHP中SQL查询中的多个参数【英文标题】:Multiple parameters in SQL query in PHP 【发布时间】:2017-03-15 01:19:20 【问题描述】:

我正在尝试使用以下代码使用 userid 参数编辑数据库中的一行。

但是使用代码我得到了这个错误:

您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在 'SET firstname = IF(? '', ?, firstname), SET surname = IF(? 附近使用正确的语法

我真的不确定问题出在哪里,因为 SQL 查询中的所有内容都按顺序排列。我试过取出 IF(? '', ?, ) 但它仍然给出错误。我已经仔细检查了表中的所有列名是否正确。我究竟做错了什么?

<?php


        include 'database_conn.php';

        if(!$conn)
        
            echo "Error connecting to database";
        

        if (mysqli_connect_errno()) 
        
            echo "<p>Connection failed:".mysqli_connect_error()."</p>\n";
        


        $id = isset($_GET['userId']) ? $_GET['userId'] : NULL; 

        $newUsername = isset($_REQUEST['updateUsername']) ? $_REQUEST['updateUsername'] : NULL;
        $newEmail = isset($_REQUEST['updateEmail']) ? $_REQUEST['updateEmail'] : NULL;
        $newPassword = isset($_REQUEST['updatePassword']) ? $_REQUEST['updatePassword'] : NULL;
        $newForename = isset($_REQUEST['updateForename']) ? $_REQUEST['updateForename'] : NULL;
        $newSurname = isset($_REQUEST['updateSurname']) ? $_REQUEST['updateSurname'] : NULL;
        $newDob = isset($_REQUEST['updateDob']) ? $_REQUEST['updateDob'] : NULL;


        $sql = "UPDATE Users
                SET username = IF(? <> '', ?, username),
                SET firstname = IF(? <> '', ?, firstname),
                SET surname = IF(? <> '', ?, surname),
                SET email = IF(? <> '', ?, email),
                SET password = IF(? <> '', ?, password),
                SET dateofbirth = IF(? <> '', ?, dateofbirth)
                WHERE id = ?";


        $stmt = mysqli_prepare($conn, $sql)
            or die(mysqli_error($conn));  

        mysqli_stmt_bind_param($stmt, "ssssssi", $newUsername, $newForename, $newSurname, $newEmail,
                            $newPassword, $newDob, $id)
            or die(mysqli_error($conn));  

        mysqli_stmt_execute($stmt)
            or die(mysqli_error($conn));  




        if($stmt)
        
            echo "Details updated successfully";   
        
        else
        
            die(mysqli_error($conn));  
        

        mysqli_close($conn);

        ?>

【问题讨论】:

你到底想用那个 SQL 语法做什么? IF(? &lt;&gt; '', ?, username) 到处都是。您是否只是想将用户名设置为等于$_REQUEST['updateUsername'])?我强烈建议检查this existing answer 这不是 UPDATE 的工作方式。 RTMdev.mysql.com/doc/refman/5.7/en/update.html 另外,我希望你不要忍受这个;存储纯文本密码。 我在另一个堆栈溢出线程上发现了它,并不确定它在做什么。如果表单中没有输入值,我要做的就是不要用空白字符串覆盖行中的值。不,弗雷德,它不会上线。 我想知道它的链接,因为语法错误。最好在回复@Ajek 时像我在这里所做的那样给我打电话。我并不总是在场。 【参考方案1】:

MySQL 的“UPDATE”仅使用 一个 SET 以逗号分隔:

https://dev.mysql.com/doc/refman/5.7/en/update.html

您的查询应为:

$query = "
  UPDATE `users`
  SET 
    `username` = IF(? <> '', ?, `username`),
    `firstname` = IF(? <> '', ?, `firstname`),
    `surname` = IF(? <> '', ?, `surname`),
    `email` = IF(? <> '', ?, `email`), 
    `password` = IF(? <> '', ?, `password`), 
    `dateofbirth` = IF(? <> '', ?, `dateofbirth`)
  WHERE `id` = ?
";

看到您基于以下问答,已经更改了它的语法:

Stop sql from updating blank or empty fields from my update form

根据你留给我的链接in the comments area。

您在 cmets 中说这不是一个实时站点。但是,如果您确实决定使用此功能,请使用 password_hash()password_verify()

参考资料:

http://php.net/manual/en/function.password-hash.php http://php.net/manual/en/function.password-verify.php

因为存储纯文本密码很危险。

注意:密码列的长度必须为 60+。手册建议 255 是一个不错的选择。

【讨论】:

以上是关于PHP中SQL查询中的多个参数的主要内容,如果未能解决你的问题,请参考以下文章

php中的SQL查询与数组中的谓词

过滤查询的php参数化查询

多个 <select> 下拉列表作为 sql 参数 | PHP

SQL查询从多个表返回数据

document.getElementById() 作为 PHP SQL 查询参数

一个 SQL 查询,还是一个循环中的多个?