【问题标题】:PHP script isn't finding MySQL table row properlyPHP 脚本未正确找到 MySQL 表行
【发布时间】:2015-10-24 21:54:59
【问题描述】:

我有一个 PHP 脚本,它应该检查我输入的用户电子邮件所在的数据库。我已经设置好所有内容,以便在提交表单时运行脚本,但我认为我的表单设置方式一定有问题。它似乎没有认识到存在一行。我输入了一个我知道存在的电子邮件地址;但是,它似乎没有找到它。

app.js

$(document).ready(function() {
    $("submit").click(function() {
        alert("This was a test.");
        $.ajax({
            type: "POST",
            url: "main_login.php",
            success: function(data) {
                alert(data);
                $(".message").text(data);
            }
        });
    });
});

main_login.php

<?php
    $conn = new mysqli('localhost', 'user', 'pass!', 'db');
    mysqli_set_charset($conn, 'utf8mb4');
    $check = "SELECT * FROM users WHERE email = '$_POST[email]'";
    $results = mysqli_query($conn, $check);
    $data = mysqli_fetch_array($results, MYSQLI_NUM);
    if($data == 1) {
        echo "Login successful";
    } else {
        echo "This account does not exist";
    }

    $conn->close();
?>

登录.php

<div class="container login">
    <div class="panel panel-default login-panel">
        <div class="panel-heading">span class="log-h1">Sign-in</span>
        </div>
        <div class="panel-body">
            <form name="loginform" action="login.php" method="post">
            <div class="form-group">
                <label for="username">Email</label>
                <input type="email" class="form-control"
                 name="email" id="email" placeholder="Email address">
            </div>
            <div class="form-group" style="float: right;">
                <input type="submit" class="btn btn-primary" name="Submit" 
                 value="Sign-in">
            </div>
            </form>
            <span class='message'></span>
        </div>
    </div>
</div>

再一次,除了验证我提供的电子邮件地址存在之外,一切正常。我认为不管我做什么都不会。

【问题讨论】:

  • 您应该首先检查您从 app.js 发送到 main_login.php 的数据是否被接收。使用 isset($_POST['email']) 方法。
  • 永远不要ever将原始的$_POST 变量直接传递到这样的SQL 字符串中。任何包含引号字符的输入都会使您的程序崩溃,这使得黑客可以很容易地对您的数据库做任何他想做的事情。使用mysqli_prepare() 了解参数化查询以确保您的查询安全。
  • 也就是说,您没有从 app.js 发送任何数据。这就是您的代码返回“帐户不存在”的原因。看看这里:stackoverflow.com/questions/5046930/…
  • 所以基本上我需要在我的$.ajax 函数中添加一个data: { 'email':'email' },
  • 附带说明,您应该真正从该发布请求中转义数据。

标签: php mysql


【解决方案1】:

尝试改变这个

$check = "SELECT * FROM users WHERE email = '$_POST[email]'";

$check = "SELECT * FROM users WHERE email = '" . $_POST['email'] . "'";

您还想更改 if - fetch_row 返回 null 或数组 (http://php.net/manual/en/mysqli-result.fetch-array.php) 所以你想做的是if($data) 而不是if($data == 1) 因为它永远不会返回1。

【讨论】:

  • 我仍然收到“此帐户不存在”说明,说明在 if 语句中未找到。
  • 不幸的是,更改为if($data) 会带来相同的结果。我认为我的 PHP 和 HTML 检查一定有问题?
【解决方案2】:

修改你的 app.js

$(document).ready(function() {
    $("submit").click(function() {
        alert("This was a test.");
        var email = $("#email").val(); // This line...
        $.ajax({
            type: "POST",
            url: "main_login.php",
            data: {email : email}, // This line..
            success: function(data) {
                alert(data);
                $(".message").text(data);
            }
        });
    });
});

修改你的 php:

<?php
    $conn = new mysqli('localhost', 'user', 'pass!', 'db');
    mysqli_set_charset($conn, 'utf8mb4');
    $check = "SELECT * FROM users WHERE email = '". $_POST['email'] ."'";
    $results = mysqli_query($conn, $check);
    $data = mysqli_fetch_array($results, MYSQLI_NUM);
    if($data == 1) {
        echo "Login successful";
    } else {
        echo "This account does not exist";
    }

    $conn->close();
?>

【讨论】:

  • 此更改似乎不再运行 PHP 函数。我只是刷新页面。
  • 是的,但这是您设置代码的方式...如果您想在数据库中存在电子邮件时收到通知,那么如果存在则执行一些操作,如果不存在则执行其他的东西然后你必须改变整个事情的工作方式...... Ajax 是异步的,所以 js 不会等待它的响应并提交表单。
【解决方案3】:

您需要更改一些内容。你可以看看herehere

主要问题在于你的 app.js

/* attach a submit handler to the form */
$("#formID").submit(function(event) {

  /* stop form from submitting normally */
  event.preventDefault();

  /* get some values from elements on the page: */
  var $form = $( this ),
      url = $form.attr( 'action' );

  /* Send the data using post */
  var posting = $.post( url, { name: $('#emailID').val() } );

  /* Alerts the results */
  posting.done(function( data ) {
    alert('success');
  });
});

这是一种更好的方法,其中 formID 是表单的 ID,emailID 是电子邮件输入的 ID,您必须将其放入 html 中。

但更简单的方法是不使用表单,而是使用简单的按钮和带有 id 的输入字段,然后使用

$("#buttonID").click(function() {
    var postData = $('#emailID').val();
    $.ajax({
        type: "POST",
        data : {'pd' : postData},
        url: "main_login.php",
        success: function(data) {
            alert(data);
            $(".message").text(data);
        }
    });

这里的 emailID 是电子邮件输入字段的 ID,而 buttonID 是按钮的 ID。此外,请务必将 jquery 脚本包含到您的 html 中。检查您的 php 文件中的 $_POST['pd']。

你的 html 可以很简单

<input type="email" id="emailID"/>
<button id="buttonID">Click</button>

请注意,您的代码存在各种安全问题。

编辑:

main_login.php

<?php
   $conn = new mysqli('localhost', 'user', 'pass!', 'db');
   mysqli_set_charset($conn, 'utf8mb4');
   if(isset($_POST['pd'] && !empty($_POST['pd'])) {
          $check = "SELECT * FROM users WHERE email =" . $_POST[email];
          $results = mysqli_query($conn, $check);
          $data = mysqli_fetch_array($results, MYSQLI_NUM);
          $conn->close();
          if($data == 1) {
              echo "Login successful";
          } else {
              echo "This account does not exist";
          }
    }
    else { echo 'postdata not received'; }      
 ?>

请注意,在发送 AJAX 响应之前,我已经关闭了数据库连接。尝试在使用 AJAX 时将响应保留为代码的最后一行,因为如果我在 AJAX 响应之后保留一些其他代码,我在不同情况下会遇到许多问题。但是,如果一切正常,您也可以忽略这一点。还要发布您在运行代码时遇到的错误。

【讨论】:

  • 非常感谢您的详细回复。我已经更改了您发布的内容以及其他一些修改;但是,当我点击提交按钮时,我的页面现在崩溃了。我觉得我的main_login.php 中一定有一些错误导致了这个错误。
猜你喜欢
  • 2012-05-20
  • 2021-11-17
  • 2013-10-18
  • 2015-01-21
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2017-06-02
相关资源
最近更新 更多