【问题标题】:Select then Insert PHP query选择然后插入 PHP 查询
【发布时间】:2018-09-01 20:58:34
【问题描述】:

如果用户存在,我可以先检查数据库,如果不存在,则使用插入语句。代码目前只执行 select 语句。

<?php
    include_once('includes/dbconn.php');

    if (isset($_POST['submitted'])) {
        $fname = $_POST['fname'];
        $lname = $_POST['lname'];
        $user = $_POST['user'];
        $pass = $_POST['pass'];

        $query_check_user = "SELECT username FROM Users WHERE username = '$user'";
        $query = "INSERT INTO Users(firstname, lastname, username, password) VALUES ('$fname','$lname','$user','$pass')";

        if (mysqli_query($dbconn, $query_check_user)) {
            echo "user already exists";
            mysqli_close($dbconn);
        }else{
            mysqli_query($dbconn, $query);
        }
    }
?>

【问题讨论】:

  • mysqli_query 仅在失败时返回 false,而不仅仅是因为它返回一个空集。
  • 请同时查看准备好的语句(您的查询容易被 SQL 注入)。
  • 检查SELECT 是否存在记录是不好的,因为它不是准确的信息。当您完成检查时,另一个进程可以插入该记录,您最终可以得到 2 条相同的记录。为了解决这个问题,我们使用unique 约束,我们只需插入,如果数据库报告duplicate key error,那么我们就知道存在一条记录。
  • @Flocke 这不是“它会发生”的情况,而是创建一个没有像这样的漏洞的系统的情况。它可能不会在今天、明天、6 个月后发生。如果它发生在2年内怎么办?然而,有趣的是,创建一个唯一的约束让我们更容易,因为我们必须输入方式,更少的代码。它是防弹的,永远。关于软删除,您始终可以从 (username, is_deleted) 或散列 (username, is_deleted) 创建唯一约束并将其保存为唯一约束。

标签: php mysql


【解决方案1】:
<?
    include_once('includes/dbconn.php');

    if (isset($_POST['submitted'])) {
        $fname = $_POST['fname'];
        $lname = $_POST['lname'];
        $user = $_POST['user'];
        $pass = $_POST['pass'];

        //Query for count
        $query_check_user = "SELECT count(*) as total FROM Users WHERE username = '$user'";
        $query = "INSERT INTO Users(firstname, lastname, username, password) VALUES ('$fname','$lname','$user','$pass')";
        //Execute query for count
        $result = mysqli_query($dbconn, $query_check_user);
        //Fetch result
        $data = mysqli_fetch_assoc($result);
        //Check if count >0
        if ($data['total']>0) {
            echo "user already exists";
            mysqli_close($dbconn);
        }else{
            mysqli_query($dbconn, $query);
        }
    }
?>

【讨论】:

  • 您的答案容易受到 sql 注入攻击。请教正确的技术。
  • 这是输出 0 if ($data['total']>0) { echo "user already exists"; mysqli_close($dbconn); }else{ mysqli_query($dbconn, $query); } } ?>
【解决方案2】:

我从你的问题中得到的是,如果用户不存在,你想插入用户,对吧?

$query_check_user = "SELECT username FROM Users WHERE username = '$user'";
$b = mysqli_query($dbconn,$query_check_user);
$a = mysqli_num_rows($b);
if($a<0):
   mysqli_query(dbconn, "INSERT INTO Users(firstname, lastname, username, password) VALUES ('$fname','$lname','$user','$pass')");
endif;

【讨论】:

  • 您的答案容易受到 sql 注入攻击。请教正确的技术。
  • 如果用户已经存在,您正在尝试插入新用户 - 可能是错误的
  • 编辑没有帮助 - 行数不会是
【解决方案3】:

您可以使用mysqli_num_rows(); 来检查数字,如果结果大于0,则用户存在,否则插入用户数据。

我的例子:

include_once('includes/dbconn.php');

    if (isset($_POST['submitted'])) {
        $fname = $_POST['fname'];
        $lname = $_POST['lname'];
        $user = $_POST['user'];
        $pass = $_POST['pass'];

        $query_check_user = "SELECT username FROM Users WHERE username = '$user'";
        $query_result = mysqli_query($query_check_user);
        $query = "INSERT INTO Users(firstname, lastname, username, password) VALUES ('$fname','$lname','$user','$pass')";

        if (mysqli_num_rows($query_result) > 0) {
            echo "user already exists";
            mysqli_close($dbconn);
        }else{
            mysqli_query($dbconn, $query);
        }
    }

【讨论】:

  • 不起作用。即使用户名存在也添加用户
  • 检查您在 phpmyadmin 上的查询或显示您的表用户名的数据库结构
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多