我的浏览器显示第26行出现错误。

<?php
$servername = "localhost";
$username = "root";
$password = "";
$database = "tut";

$conn = mysqli_connect($servername, $username, $password, $database);

if (!$conn) {
    die("Database connection failed: ".mysqli_connect_error());
}
 if (isset($_POST['register']))
{
    $user = $_POST['username'];
    $pass = $_POST['password'];
    $pass2=$_POST['password1'];

    if(empty($username)||empty ($password)||empty($password1)){
        echo "Oops! Can't leave any field blank";
    }
    elseif($pass!=$pass2){
        echo "Passwords don't match";
    }
    else{
        $phash = sha1(sha1($pass."salt")."salt");
        $sql=IF NOT EXISTS (SELECT * FROM users WHERE username = '$user')
            INSERT INTO users (id, username, password) VALUES ('', '$user', '$phash')
        ELSE
            RAISERROR 'Username exists, please select a different one';
        $result = mysqli_query($conn, $sql);
    }
}
?>


这不是编写IF NOT EXISTS语句的正确方法吗?另外,当我尝试直接在XAMPP中执行此操作时,也会收到无法识别的SQL语句错误!

最佳答案

这是方法,我已经对其进行了测试,并且可以正常工作:

$sql = "
    INSERT INTO users (username, password)
    SELECT * FROM (SELECT '$user', '$phash') AS tmp
    WHERE NOT EXISTS (
        SELECT username FROM users WHERE username = '$user'
    ) LIMIT 1;
";


此解决方案的灵感来自此answer

问题是您不能像以前那样组合PHP和MySQL语句,需要将所有MySQL语句封装在引号"中。

RAISERROR是什么,不是MySQL函数,它属于Microsoft。

您可以轻松地制作php if语句,以检查$sql是否包含有效的用户名并返回您的消息。那部分留给你幻想。

XAMPP与该错误无关,它只是一个为Windows提供Apache和MySQL安装的软件。


  注意:PS请学习使用参数化查询,因为您的
  代码容易受到SQL注入的攻击。感谢@BillKarwin提到这一点。

09-10 14:29
查看更多