更新记录失败:(1064)

时间:2014-04-08 21:29:14

标签: php mysqli

我有一张表格中所有用户的列表。在他们的右边,我有一个更新按钮。当我按下更新按钮时,我被发送到更新页面。我有用户ID,因此链接会像这样:/update.php?id=22

在更新页面上,我有更新表单:

        <table>
            <tr>
                <th>First Name:</th>
                <td><input type="text" value="<?php $user->get_first_name($id);?>" name="first_name"></td>
            </tr>
            <tr>
                <th>Last Name:</th>
                <td><input type="text" value="<?php $user->get_last_name($id);?>" name="last_name"></td>
            </tr>
            <tr>
                <th>Email:</th>
                <td><input type="text" value="<?php $user->get_email($id);?>" name="email"></td>
            </tr>
            <tr>
                <th>Password:</th>
                <td><input type="text" value="<?php $user->get_password($id);?>" name="password"></td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td><input type="submit" name="submit" value="Update" ></td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td><a href="login.php">Already registered! Click Here!</a></td>
            </tr>                 
        </table>

我获取信息的方式是这样的:

public function get_first_name($id){
            $sql3="SELECT first_name FROM users WHERE id = $id";
            $result = mysqli_query($this->db->mysqli,$sql3);
            $user_data = mysqli_fetch_array($result);
            echo $user_data['first_name'];
}

等等,每个领域。

然后我按照这样的方式调用我的函数:

if (isset($_POST['submit'])){

        if (empty ( $_POST ['first_name'] ) || empty ( $_POST ['last_name'] )|| empty ( $_POST ['email'] ) || empty ( $_POST ['password'] )) {

            $errors [] = 'All fields are required.';
        } 
        if (empty ( $errors ) === true) {   
            extract($_POST);
            $register = $user->update_user($id, $first_name, $last_name,$password, $email);
        }
    }

我的功能看起来像这样:

public function update_user($id, $first_name,$last_name,$password,$email){

            $sql = "UPDATE users SET first_name = $first_name, last_name = $last_name, email = $email, password = $password  WHERE id = ?";
            $result = $this->db->mysqli->query($sql);
            if (!$result) {

                echo "Update record failed: (" . $this->db->mysqli->errno . ") " . $this->db->mysqli->error;

            } else {

                // Print the table
                header("Location: ../admin.php");

            }
        }

但是当我尝试更新用户时,我收到了一个错误:

Update record failed: (1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@gmail.com, password = ASDASDASD WHERE id = ?' at line 1

我的sql一定有问题。 我希望你们中的一个人能发现我的错误

3 个答案:

答案 0 :(得分:1)

在查询中使用字符串引号,转义字符串值并散列密码:

$sql = "UPDATE users 
    SET
        first_name = '".mysqli_real_escape_string($this->db->mysqli, $first_name)."', 
        last_name = '".mysqli_real_escape_string($this->db->mysqli, $last_name)."', 
        email = '".mysqli_real_escape_string($this->db->mysqli, $email)."', 
        password = '".mysqli_real_escape_string($this->db->mysqli, crypt($password, $salt))."'
    WHERE id = " . $id;

crypt function使用适当的盐。

两个建议:

  • 永远不要以纯文本形式存储密码!请在存储之前正确哈希。如果以某种非法方式(黑客)访问您的数据库,那么这些纯文本密码就是对攻击者的邀请。您的数据库中可能没有敏感数据,但人们往往会反复使用相同的密码,因此可能会在其他网站上使用。
  • 永远不要向用户显示当前密码!表单中密码字段的value属性应始终为空。

答案 1 :(得分:1)

实际问题/错误是由于您没有引用字符串值而引起的。

但是,如果你这样做,你需要使用一个转义函数来确保你可以安全地插入你的值(避免sql注入)。

最好使用如下的预备语句:

UPDATE users SET first_name = ?, last_name = ?, email = ?, password = ?  WHERE id = ?

(那里你不需要引号)

并绑定值并在此之后执行语句。

你已经拥有了这样的id设置(虽然你也没有绑定它,导致以后出现另一个错误),所以你已经知道要走哪条路了。

除此之外:

  • 不要存储纯文本(或加密的......)密码。使用盐渍哈希;你可以在SO上找到更多关于它的信息。
  • 您应该一次性获取用户信息,而不是使用单独的数据库查询。

答案 2 :(得分:1)

您应该将更新查询email = $ password更改为email = $ email