【问题标题】:Cannot find solution to the problem in prepared statement(procedural php)在准备好的语句中找不到问题的解决方案(程序 php)
【发布时间】:2019-05-30 11:10:23
【问题描述】:
<?php

    if(isset($_POST['register-button']))
    {
    include 'dbh.inc.php';
    error_reporting(0);
    $uname = $_POST['username'];
    $name = $_POST['name'];
    $email = $_POST['email'];
    $pwd = $_POST['pass'];
    $rpwd = $_POST['repass'];
    $city = $_POST['city'];
    $age = $_POST['age'];
    $gender = $_POST['gender'];
    $courses = implode(',',$_POST['lang']);

    if(empty($uname) || empty($name) || empty($email) || empty($pwd) ||  empty($rpwd) || empty($city) || empty($age) || empty($gender) || empty($courses)){
        header("Location: ../register.php?error=emptyfields&name=".$name."&email=".$email."&city=".$city."&age=".$age);
        exit();
    }
    elseif(!filter_var($email, FILTER_VALIDATE_EMAIL) && !preg_match("/^[a-zA-Z0-9]*$/", $uname){
        header("Location: ../register.php?error=invaliduname&email");
        exit();
    }
    elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)){
        header("Location: ../register.php?error=invalidemail&username=".$uname."name=".$name."&city=".$city."&age=".$age);
        exit();
    }
    elseif(!preg_match("/^[a-zA-Z0-9]*$/", $username)){
        header("Location: ../register.php?error=invalidusername&name=".$name."email=".$email."&city=".$city."&age=".$age);
        exit();
    }
    elseif($pwd!=$rpwd){
        header("Location: ../register.php?error=passwordcheck&username=".$uname."name=".$name."&email=".$email."&city=".$city."&age=".$age);
        exit();
    }
    else{
        $sql1 = "select * from users where uname=?";
        $sql2 = "select * from users where email=?";

        $stmt1 = mysqli_stmt_init($conn);
        $stmt2 = mysqli_stmt_init($conn);

        if(!mysqli_stmt_prepare($stmt1,$sql1) && !mysqli_stmt_prepare($stmt2,$sql2)){
            header("Location: ../register.php?error=sqlerror");
            exit();
        }
        else{
            mysqli_stmt_bind_param($stmt1,"s",$uname);
            mysqli_stmt_bind_param($stmt2,"s",$email);

            mysqli_stmt_execute($stmt1);
            mysqli_stmt_execute($stmt2);

            mysqli_stmt_store_result($stmt1);
            mysqli_stmt_store_result($stmt2);

            $resultcheck1=mysqli_stmt_num_rows($stmt1);
            $resultcheck2=mysqli_stmt_num_rows($stmt2);

            if($resultcheck2>0){
                header("Location: ../register.php?error=registeredemail");
                exit();
            }
            elseif($resultcheck1>0){
                header("Location: ../register.php?error=usernametaken");
                exit();
            }
            else{
                $sql="insert into users values(?,?,?,?,?,?,?,?)";
                $stmt=mysqli_stmt_init($conn);
                if(!mysqli_stmt_prepare($stmt,$sql)){
                    header("Location: ../register.php?error=sqlerror");
                    exit();
                }
                else{
                    $hpass = password_hash($pwd, PASSWORD_DEFAULT);
                    mysqli_bind_param($stmt,"ssssssss",$uname,$name,$email,$hpass,$city,$age,$gender,$courses);
                    mysqli_stmt_execute($stmt);

                    session_start();
                    $_SESSION['uid']=$uname;

                    header("Location: ../index.php");
                    exit();
                }
            }
        }
    }
    }
    else
    {
    header("Location: ../index.php");
    exit();
    }
?>

警告:mysqli_stmt_bind_param(): 第 50 行 C:\xampp\htdocs\php\responsive_website\includes\signup.inc.php 中的无效对象或资源 mysqli_stmt

警告:mysqli_stmt_execute(): 第 53 行 C:\xampp\htdocs\php\responsive_website\includes\signup.inc.php 中的无效对象或资源 mysqli_stmt

警告:mysqli_stmt_store_result(): 第 56 行 C:\xampp\htdocs\php\responsive_website\includes\signup.inc.php 中的无效对象或资源 mysqli_stmt

警告:mysqli_stmt_num_rows(): 第 59 行 C:\xampp\htdocs\php\responsive_website\includes\signup.inc.php 中的无效对象或资源 mysqli_stmt

致命错误:未捕获的错误:调用 C:\xampp\htdocs\php\responsive_website\includes\signup.inc.php:78 中未定义的函数 mysqli_bind_param() 堆栈跟踪:#0 {main} 在 C:\ xampp\htdocs\php\responsive_website\includes\signup.inc.php 在第 78 行

【问题讨论】:

  • 当mysqli函数失败时使用mysqli_error(),这样你就能看到原因。
  • 不需要使用两个查询。 SELECT MAX(email = ?) AS email_used, MAX(uname = ?) AS uname_used FROM users WHERE email = ? or uname = ?

标签: php session mysqli


【解决方案1】:

您的问题是,只有当 两个 准备($stmt1$stmt2)失败时,您才退出,如果 其中一个 失败,您应该退出。更改此行:

if(!mysqli_stmt_prepare($stmt1,$sql1) && !mysqli_stmt_prepare($stmt2,$sql2)){

if(!mysqli_stmt_prepare($stmt1,$sql1) || !mysqli_stmt_prepare($stmt2,$sql2)){

您还应该使用mysqli_error() 找出为什么准备失败,也许将其添加到您重定向到的位置,例如

header("Location: ../register.php?error=sqlerror&msg=" . urlencode(mysqli_error($conn)));

你的另一个问题是你有一个错字,mysqli_bind_param 应该是第 78 行的mysqli_stmt_bind_param

【讨论】:

  • 这无助于找出准备失败的原因。
  • 让我改一下看看
  • @Nick 致命错误:未捕获的错误:调用 C:\xampp\htdocs\php\responsive_website\includes\signup.inc.php:78 中未定义的函数 mysqli_bind_param() 堆栈跟踪:#0 { main} 在第 78 行的 C:\xampp\htdocs\php\responsive_website\includes\signup.inc.php 中抛出
  • @JaspreetSingh mysqli_bind_param 应该是 mysqli_stmt_bind_param
  • 我想我现在应该睡个好觉了..lmao
猜你喜欢
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 2011-06-02
  • 2012-12-09
  • 2011-06-21
  • 2011-07-13
  • 1970-01-01
相关资源
最近更新 更多