Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检查数据库中是否存在用户_Php_Mysqli - Fatal编程技术网

Php 检查数据库中是否存在用户

Php 检查数据库中是否存在用户,php,mysqli,Php,Mysqli,我创建了一个user类,它验证通过表单传递的数据,然后更新数据库表users。我想添加额外的功能,例如检查表中是否存在用户名和电子邮件,我添加了一个小脚本,但它似乎不起作用 我插入了一个重复的电子邮件地址,但没有收到错误消息“电子邮件存在”,而是收到了成功消息“插入了1行”: 我下面做错什么了吗?有没有更好的方法来解决这个问题 public function insert() { if (isset($_POST['submit'])) { $email = isset($_POST

我创建了一个user类,它验证通过表单传递的数据,然后更新数据库表users。我想添加额外的功能,例如检查表中是否存在用户名和电子邮件,我添加了一个小脚本,但它似乎不起作用

我插入了一个重复的电子邮件地址,但没有收到错误消息“电子邮件存在”,而是收到了成功消息“插入了1行”:

我下面做错什么了吗?有没有更好的方法来解决这个问题

 public function insert() {

if (isset($_POST['submit'])) {
    $email = isset($_POST['email']) ? $this->mysqli->real_escape_string($_POST['email']) : '';

$result = $this->mysqli->prepare("SELECT * FROM users WHERE email='".$email."'");

if ($result->num_rows) {
echo "email exisits!";
} 
 else
 {
$stmt = $this->mysqli->prepare("INSERT INTO users (username, password, name, email) VALUES (?, ?, ?, ?)");
        $stmt->bind_param('ssss', $username, $password, $name, $email); // bind strings to the paramater
        //escape the POST data for added protection

$username = isset($_POST['username']) ? $this->mysqli->real_escape_string($_POST['username']) : '';
$cryptedPassword = crypt($_POST['password']);
$password = $this->mysqli->real_escape_string($cryptedPassword);
    $name = isset($_POST['name']) ? $this->mysqli->real_escape_string($_POST['name']) : '';
    $email = isset($_POST['email']) ? $this->mysqli->real_escape_string($_POST['email']) : '';
        /* execute prepared statement */
$stmt->execute();
    printf("%d Row inserted.\n", $stmt->affected_rows);
    /* close statement and connection */
$stmt->close();
            }

您需要在prepare语句之后使用此代码

$stmt->execute();
$stmt->store_result();
把这个

if ($result->num_rows > 0) {
echo "email exisits!";
} 
而不是

if ($result->num_rows) {
echo "email exisits!";
} 

从我所看到的情况来看,在使用if($result->num_rows)测试num_rows之前,您没有为num_rows赋值,因此它总是0

首先,您使用的是
prepare
(太棒了!),但随后您只是传递电子邮件的值,实际上破坏了prepared语句的好处

其次,您从不执行查询,这就是为什么在
num\u行
中没有任何内容

public function insert() {

$result = $this->mysqli->prepare("SELECT COUNT(*) FROM users WHERE email=?");
$result->bind_param("s", $_POST['email']);
$result->execute();
$result->bind_result($email_count);

if ($email_count) {
    echo "email exisits!";
} else {
   # your other logic

您使用的API是您所能选择的最差的API

有了安全MySQL,情况会变得更糟

$exists = $this->db->getOne("SELECT 1 FROM users WHERE email=?s", $_POST['email']);
if ($exists) {
    echo "email exisits!";
} 
使用PDO,它稍微长一些,但可用

$stmt = $this->db->prepare("SELECT 1 FROM users WHERE email=?");
$stmt->execute(array($_POST['email']));
$exists = $stmt->fetchColumn();
if ($exists)
{
    echo "email exisits!";
} 
但对于原始mysqli,您只需要一屏代码来检查用户是否存在

因此,使用safeMysql的整个函数将是

public function insert()
{
    if (!isset($_POST['submit'])) {
        return FALSE;
    }

    $sql    = "SELECT 1 FROM users WHERE email=?s";
    $exists = $this->db->getOne($sql, $_POST['email']);
    if ($exists)
    {
        echo "email exisits!";
        return FALSE;

    }
    $sql     = "INSERT INTO users SET ?u";
    $allowed = array('username', 'name', 'email');
    $insert  = $this->db->filterArray($_POST, $allowed);
    $insert['password'] = crypt($_POST['password']);
    $this->db->query($sql, $insert);
    return $this->db->afectedRows();
}

如果您在
电子邮件
上添加
唯一的
索引,可能可以有效防止多个用户使用同一封电子邮件。使用/*execute query/$result->execute();/存储结果*/$result->store_result();然后使用$result->num_rows()提醒你,你的代码是臃肿和错误的。@YourCommonSense ok谢谢你的见解comment@vishalshah不,我没有,我现在就试试这个谢谢ID工作,我需要像下面那样绑定我的结果吗?你需要使用store_result()来使用num_row,你需要使用$stmt->execute();插入查询后准备语句我有点喜欢这个完全错误的答案最终被编辑的方式,因为它的作者从其他评论中学习到了正确的答案。@你的常识你是什么意思?谢谢你会研究PDO,我还认为准备语句是好的实践@你的常识还是仅仅是MySQLi的使用@你的常识准备好的陈述是很好的实践,但是你用错了。好的,我明白了,你能给我一个正确的方式和我的方式的例子吗,所以我知道这一点,请@yourcomsense我在回答中已经给出了几个例子。Burhan Khalid的一个包含另一个实现了这一点,但我得到了以下错误:
警告:mysqli_stmt::bind_param():变量的数量与第52行E:\xampp\htdocs\imanage\insert.php中准备好的语句中的参数数量不匹配
致命错误:调用成员函数bind_param()在第60行E:\xampp\htdocs\imanage\insert.php中的非对象上
我只定义了一个变量,它是email,因此不理解错误消息,有什么建议吗@伯汉哈利德诺普,他的想法是正确的