首页 > 解决方案 > PHP注册无法使用prepare sql语句

问题描述

我使用 php 和 mysql prepare 语句编写了注册代码。我不知道为什么它不插入记录!谁能告诉问题出在哪里它没有显示任何错误或成功消息,即使这里是我的 adduser.php 代码

<?php 

 include 'config.php';

 //checkusername
 $check = $con->prepare("select username from users");

 while($row = $check->fetch(PDO::FETCH_ASSOC)){
     if($row['username'] == $_POST['username'])
        echo -1;
     else{

        $sql = $con->prepare("insert into users(name,username,password) values(?,?,?)");
        $sql->bindParam($name,$username,$password);
        $name = $_POST['name'];
        $username = $_POST['username'];
        $password = md5($_POST['password']);
        $sql->execute();
            echo 1;
     }
   }

 ?>

标签: phpmysqlsqlpdoprepared-statement

解决方案


$sql->bindParam($name,$username,$password);

是不正确的。您必须通过单独调用 bindParam 来绑定每个参数。

请参阅 PHP手册页中的参数列表和示例,了解 bindParam 函数接受什么作为输入,以及如何在实践中使用它。

例如

$sql = $con->prepare("insert into users(name,username,password) values(?,?,?)");
$sql->bindParam(1, $name);
$sql->bindParam(2, $username);
$sql->bindParam(3, $password);
...
$sql->execute();

或者,您可以简单地调用执行函数并以这种方式传递参数数组:

$sql = $con->prepare("insert into users(name,username,password) values(?,?,?)");
$params = [$name, $username, $password];
$sql->execute($params);

PS 如果您在运行代码时没有收到任何类型的错误或有关此问题的指示,请确保您启用了 PHP 的错误记录功能PDO 的异常报告模式,以便您可以获取有关代码中任何错误的详细信息。

PPS 请不要使用过时的、不安全的 md5 算法存储密码 - 这是一个安全风险。改为了解 PHP 内置的、最新的、安全的密码散列和验证功能

PPPS 查询所有用户并遍历它们以查找具有相同用户名的任何现有记录是没有意义的。这是非常低效的。WHERE您可以使用 中的 SQL子句更快更有效地过滤结果SELECT,例如select username from users where username = ?。将用户名绑定到该用户名,如果匹配,您将得到单行作为响应。


推荐阅读