Как вы можете одновременно использовать SQL COUNT и mysqli_stmt_num_rows? - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь создать сценарий php, в котором вы указываете свой адрес электронной почты в веб-форме. Если адрес электронной почты не существует в mysql db, должна активироваться функция register (). Иначе функция login (). Теперь, независимо от того, какой адрес электронной почты я ввожу, будь то, который существует в БД или нет, я всегда получаю срабатывание register (). Почему это так?

Вот базовый c код. Я не дал коды regsiter () или login (), так как они не имеют значения на данный момент.

<code>if($_SERVER['REQUEST_METHOD'] == 'POST')
{
if(!isset($_POST['email_account']) || !isset($_POST['email_service']))
{
    $email_error = "<font color='red'>Input Email Address!</color>";
}
else
{
    echo "Line 13 triggered<br>"; //DELETE THIS

    $conn = mysqli_connect("localhost","root","","test");

    if($conn === false)
    {
        die("ERROR: Connection Error!. " . mysqli_connect_error());
    }
    else
    {
        echo "Line 24 triggered<br>"; //DELETE THIS
        //Set Parameters.
        $email = trim($_POST["email_account"]) . '@' . trim($_POST["email_service"]);
        echo "line 27 triggered: $email<br>";

        $sql_query = "SELECT COUNT(personal_email) FROM users WHERE personal_email = ?";
        $stmt = mysqli_prepare($conn,$sql_query);
        if($stmt == false) 
        {
          // just for debugging for now:
          die("<pre>Prepare failed:\n".mysqli_error($conn)."\n$sql_query
");} else {echo" Строка 38 запущена
"; // УДАЛЯЕМ ЭТО mysqli_stmt_bind_param ($ stmt, 's', $ email); if (! mysqli_stmt_execute ($ stmt)) {echo "Строка 43 запущена
"; // УДАЛИТЬ ЭТО // Закрыть соединение. mysqli_close ($ conn); d ie ( "Не удалось mysqli_stmt_execute! Пожалуйста, попробуйте позже!");} Echo "Строка 50 запущена
"; // УДАЛИТЬ ЭТО // // if ($ sql_query == 1) if (mysqli_stmt_num_rows ($ stmt) == 1) { echo "Строка 57 сработала: функция login () сработает!
"; // УДАЛИТЬ ЭТО $ _SESSION ['session_type'] = 'login'; login ();} else {echo "Строка 64 сработала: функция register ( ) сработает!
"; // УДАЛИТЬ ЭТУ $ _SESSION ['session_type'] = 'register'; register ();}}}}}

Я получаю повторение следующего, как вы видите в звездочках:

  • Линия 13 сработала
  • Линия 24 сработала
  • Линия 27 сработала: realemail@gmail.com
  • Линия 38 сработала
  • Линия 53 сработало
  • Сработала строка 64: сработает регистр функций (*)!

Если возможно использовать как SQL COUNT, так и php 's mysqli_stmt_num_rows($stmt), тогда кто-то любезно покажет мне, как это сделать. Но если иначе, то любезно покажите мне 2 примера. Один с Sql COUNT и один с php s mysqli_stmt_num_rows($stmt).

ПРИМЕЧАНИЕ. На самом деле я хочу научиться считать строки, используя Sql COUNT. Если COUNT = 0, то зарегистрируйтесь (). Иначе, если COUNT = 1, то login (). Здесь мы рассчитываем на наличие адреса электронной почты в базе данных mysql.

1 Ответ

1 голос
/ 06 апреля 2020

Вам не нужно mysqli_stmt_num_rows() вообще. Вы уже получили COUNT(), поэтому просто используйте этот результат в PHP. mysqli_stmt_num_rows() даст вам 1 раз в любом случае. Это число строк, возвращаемых MySQL, и вы всегда запрашиваете одну строку, содержащую количество совпадающих записей в MySQL.

Я удалил весь неверный код mysqli из вашего скрипта и добавил get_result(). Остальное я оставил как было.

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (!isset($_POST['email_account']) || !isset($_POST['email_service'])) {
        $email_error = "<font color='red'>Input Email Address!</color>";
    } else {
        echo "Line 13 triggered<br>"; //DELETE THIS

        mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
        $conn = mysqli_connect("localhost", "root", "", "test");
        $conn->set_charset('utf8mb4'); // always set the charset

        echo "Line 24 triggered<br>"; //DELETE THIS
        //Set Parameters.
        $email = trim($_POST["email_account"]) . '@' . trim($_POST["email_service"]);
        echo "line 27 triggered: $email<br>";

        $sql_query = "SELECT COUNT(personal_email) FROM users WHERE personal_email = ?";
        $stmt = $conn->prepare($sql_query);

        echo "Line 38 triggered<br>"; //DELETE THIS
        $stmt->bind_param('s', $email);

        $stmt->execute();

        $result = $stmt->get_result();

        echo "Line 50 triggered<br>"; //DELETE THIS
        if ($result->fetch_array()[0]) {
            echo "Line 57 triggered: Function login() will trigger!<br>"; //DELETE THIS
            $_SESSION['session_type'] = 'login';
            login();
        } else {
            echo "Line 64 triggered: Function register() will trigger!<br>"; //DELETE THIS
            $_SESSION['session_type'] = 'register';
            register();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...