【解決方法】キャッチされないエラー: C:\xampp\htdocs\newfolder\login.php:66 スタック トレースの bool に対するメンバー関数 binding_param() の呼び出し: C:\xampp\htdocs\newfolder\login で #0 {main} がスローされました.php 66行目

プログラミングQA

[ad_1]

<?php
   $driver = new mysqli_driver();
   $driver -> report_mode = MYSQLI_REPORT_OFF;
   
   if(isset($_SESSION['log']))
   {
      header('Location: welcome.php');
      exit();
   }
   else
   {
      if($_SERVER["REQUEST_METHOD"] == "POST")
      {
         function validData($x)
         {
            $x = trim($x);
            $x = stripslashes($x);
            $x = htmlspecialchars($x);
            return $x;
         }
         
         $server = "localhost";
         $user = "root";
         $pass = "";
         $db = "codescracker";
      
         $conn = @new mysqli($server, $user, $pass, $db);
      
         if($conn->connect_errno)
         {
            echo "Database connection failed!<BR>";
            echo "Reason: ", $conn->connect_error;
            exit();
         }
      
         $fname = $lname = $uname = $email = $pass = "";
         $unameE = $emailE = $passE = "";
         
         $fname = validData($_POST["firstname"]);
         $lname = validData($_POST["lastname"]);
         $uname = validData($_POST["username"]);
         $email = validData($_POST["email"]);
         $pass = validData($_POST["password"]);
         
         if(empty($uname))
            $unameE = "Username field was empty!<BR>";
         if(empty($email))
            $emailE = "Email Id field was empty!<BR>";
         if(empty($pass))
            $passE = "Password field was empty!<BR>";
         if(strlen($uname)<6)
            $unameE .= "Username must be of 6 or more characters!<BR>";
         if(strlen($pass)<6)
            $passE .= "Password must be of 6 or more characters!<BR>";
         if(!filter_var($email, FILTER_VALIDATE_EMAIL))
            $emailE .= "Enter a valid Email ID!<BR>";
      
         if(!empty($unameE) || !empty($emailE) || !empty($passE))
            $err = "Try again";
         else
         {
            $sql = "INSERT INTO `users`(`FirstName`, `LastName`, `Username`, `Email`, `Password`)
               VALUES (?, ?, ?, ?, ?)";
            
            $stmt = $conn->prepare($sql);
            $stmt->bind_param("sssss", $fname, $lname, $uname, $email, $pass);
      
            if($stmt->execute())
            {
               $_SESSION['log'] = $uname;
               header('Location: welcome.php');
               exit();
            }
            else
               $execE = "Something went wrong<BR>Please try again!";
         }
         $conn->close();
      }
   }
?>
<HTML>
<HEAD>
<STYLE>
   .form{width: 400px; margin: auto; padding: 12px; border-left: 2px solid #ccc; border-radius: 18px;}
   h2{color: purple; text-align: center;}
   input{padding: 12px; width: 100%; margin-bottom: 12px; border: 0px; border-radius: 6px;
      background-color: #ccc;}
   button{margin: 20px 0px; width: 100%; background-color: #008080; color: white; padding: 12px;
      font-size: 1rem; border-radius: 6px;}
   p{text-align: center;}
   button:hover{cursor: pointer;}
   .red{color: red;}
</STYLE>
</HEAD>
<BODY>

<DIV class="form">
   <H2>User Registration Form</H2>
   <FORM name="register" method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
      <LABEL>First Name</LABEL><BR>
      <INPUT type="text" name="firstname" placeholder="First Name"><BR>
      <LABEL>Last Name</LABEL><BR>
      <input type="text" name="lastname" placeholder="Last Name"><BR>
      <LABEL>Username
      <?php
         if(!empty($unameE))
            echo "<SPAN class=\"red\">*</SPAN>";
         else
            echo "*";
      ?>
      </LABEL><BR>
      <INPUT type="text" name="username" placeholder="Create Username" required><BR>
      <LABEL>Email
      <?php
         if(!empty($emailE))
            echo "<SPAN class=\"red\">*</SPAN>";
         else
            echo "*";
      ?>
      </LABEL><BR>
      <INPUT type="text" name="email" placeholder="Email ID" required><BR>
      <LABEL>Password
      <?php
         if(!empty($passE))
            echo "<SPAN class=\"red\">*</SPAN>";
         else
            echo "*";
      ?>
      </LABEL><BR>
      <INPUT type="text" name="password" placeholder="Create Password" required><BR>
      <BUTTON type="submit">Register</BUTTON>
   </FORM>
   <?php
   if(isset($err))
   {
      echo "<DIV class=\"red\">";
      if(!empty($unameE))
         echo $unameE;
      if(!empty($emailE))
         echo $emailE;
      if(!empty($passE))
         echo $passE;
      echo "</DIV>";
   }
   elseif(isset($execE))
      echo $execE;
   else
   {
      echo "<P>Direction:  Username and Password must be of 6 or more characters.<BR>";
      echo "Star (*) Fields must not be empty.<BR>";
      echo "Special characters are not allowed.</P>";
   }
   ?>
   <P>Already registered ? <a href="login.php">Login</a></P>
</DIV>

</BODY>
</HTML>
The output produced by above PHP MySQLi user registration form, is shown in the snapshot given below:

私が試したこと:

今のところ私は何も試していません

解決策 1

エラー メッセージを確認すると、多くの情報が得られます。 それが発生するファイルを示します。 login.php、それが起こった行を示します。66そして、何が間違っていたかを示します。 call to a member function bind_param() on bool

したがって、66 行目に進みます。

PHP
$stmt->bind_param("sssss", $fname, $lname, $uname, $email, $pass);

そしてそれは呼びます bind_param の上 $stmt それがどうして間違っているのでしょうか? 上の行を見て、どこにあるかを確認してください。 $stmt 値がロードされました:

PHP
$stmt = $conn->prepare($sql);
$stmt->bind_param("sssss", $fname, $lname, $uname, $email, $pass);

if($stmt->execute())

次に、ドキュメントを見てください。 prepare メソッドを実行して、その戻りコードを確認します。 PHP:mysqli::prepare – マニュアル[^]

引用:

mysqli_prepare() はステートメント オブジェクトを返すか、エラーが発生した場合は false を返します。

ああ! エラーはこう言いました bool 関与していたので、 prepare 戻ってきています false

つまり、何らかの理由で失敗したということです。
SQL は非常に合理的であるように見えます。

SQL
INSERT INTO `users`(`FirstName`, `LastName`, `Username`, `Email`, `Password`) VALUES (?, ?, ?, ?, ?)

したがって、接続が原因である可能性がありますが、システムにアクセスできないためテストできません。

ですから、そこから始めて、何が間違っているのかを探してください。

コーディング中には、おそらく 1 日に何度もエラーが発生することを覚悟しておく必要があります。どれだけ経験があるかに関係なく、誰もがエラーを経験します。 場合によっては、変数やキーワードのスペルを間違えることがあります。 文字列やコード ブロックを閉じるのを忘れることがあります。 猫がキーボードの上を歩いて、非常に奇妙な文字を入力することがあります。 メソッド呼び出しに必要なパラメーターの数を忘れてしまうことがあります。

我々はすべての間違いを犯します。

そして、私たち全員が構文エラーを修正する必要があるため、構文エラーを修正する必要があります。そして、他の人が修正してくれるのを待つよりも、自分で修正する方法を学んで修正する方がずっと早いのです。 したがって、エラー メッセージの読み方と、コンパイラーが間違っていると伝えている内容に照らして書かれたコードを解釈する方法を学ぶのに少し時間を投資してください。それは本当に役に立ちます。

それで、これを読んでください: 問題を解決するコードの書き方、初心者ガイド パート 2: 構文エラー[^] – 次回エラーが発生したときに役立つはずです。

そして…それよりもさらに深い問題を修正する必要があります。パスワードをクリア テキストで保存しないでください。これは重大なセキュリティ リスクです。 その方法については、ここにいくつかの情報があります。 パスワードの保管: その方法。[^]

また、これが Web ベースであり、欧州連合ユーザーがいる場合は、GDPR が適用されるため、パスワードを機密データとして扱い、安全な方法で保存する必要があることを意味します。 テキストはそのどちらでもないので、罰金は …. うーん … 未払いになる可能性があります。 2018年12月、ドイツの企業はそれだけの理由で2万ユーロという比較的低額の罰金を科せられた。

解決策 2

prepare(‘INSERT INTO “ユーザー” (ユーザー名、電子メール、名、姓、パスワード) VALUES (:ユーザー名、:電子メール、:名、:姓、:パスワード)’);
$stmt->bindParam(‘:ユーザー名’, $ユーザー名);
$stmt->bindParam(‘:email’, $email);
$stmt->bindParam(‘:firstname’, $firstname);
$stmt->bindParam(‘:lastname’, $lastname);
$stmt->bindParam(‘:password’, $hashedPassword);

if ($stmt->execute()) {
echo ‘サインアップが成功しました!’;
} それ以外 {
echo ‘エラー: サインアップできません。’;
}
}
}
?>

[ad_2]

コメント

タイトルとURLをコピーしました