【问题标题】:calling a successful ajax post function doesn't return any data调用成功的 ajax post 函数不会返回任何数据
【发布时间】:2017-12-22 11:11:18
【问题描述】:

我正在尝试通过 ajax 将数据从表单传递到后端 php 脚本以与数据库交互。运行 verifyUN 函数,它会检查是否存在类似的用户,然后继续执行下一个函数 create。不幸的是,该 create 函数没有从它调用的 php 脚本中得到任何传回给它的东西。运行两个不同的 $.post 函数不起作用吗?我缺少一些简单的东西吗?

    function verifyUN(username,password) {
        $.post('verify.php', { login: username}, function(result) {
                console.log("passed from ajax to verify, returned: "+ result);
                if (result==0) {
                    create(username,password);
                }
                else if(result == 1) {
                    alert("Username already exists!"); //until a better error
                }
                else {
                    alert("Error:" +result);
                }
        });

    }

这个函数 create 不打印任何返回的数据。即使我粘贴了 vertifyUN 的内部结构,使其与 verifyUN 做同样的事情。但是,考虑到它正在传递的数据,它仍然成功地接触数据库,甚至将数据插入数据库。只是没有任何返回表明它是成功的......

    function create(username,password){
        console.log("This is inside create function");
        $.post('create.php', { login: username, password: password}, function(returned) {
                console.log("passed from create.php to verify, returned: "+ returned);

        });
    }

verify.php 代码,通过 verifyUN 成功运行。

//needs cleaned
require '../database/info.php';

$dbname = "test";

$conn = new mysqli($servername, $username, $password, $dbname);

if($conn->connect_error) {

    die("connection not created: ". $conn->connect_error);

}

$username = htmlspecialchars($_POST['login']);

if($query = $conn->prepare("SELECT username FROM User WHERE username = ?") ) { 

    $query->bind_param("s", $username);
    $query->execute();
    $query->bind_result($un);

    $query->fetch();
    $query->close();
    if ( $username != $un ) { //double checking

        $result = 0; //doesn't exist, sends to ajax

    }
    else {
        $result =1; //username exists, sends to ajax
    }

    echo json_encode($result);

}
else {
    echo "query failed\n";
}

$conn->close();

?>

如果需要,请创建.php

require '../database/info.php';

$dbname = "test";

$conn = new mysqli($servername, $username, $password, $dbname);

if($conn->connect_error) {

    die("connection not created: ". $conn->connect_error);

}

// if (!isset($_POST['login'])) {
//  $_POST['login'] = "testing";
// }
// if (!isset($_POST['password'])) {
//  $_POST['password'] = "password";
// }

$username = htmlspecialchars($_POST['login']);
$password = htmlspecialchars($_POST['password']);
$result = 0;
//echo "first result: $result\n";
$q1 = "INSERT INTO User (username) VALUES (?)";
$q2 = "INSERT INTO Security (username, shpassword) VALUES (?, ?)";

if( $stmt = $conn->prepare($q1) ) { 

    $stmt->bind_param("s", $username);
    $stmt->execute();
    $stmt->close();

    $result++;

}
else {
    $result = 0;

    echo json_encode("Username failed\n");
}

if ( $stmt = $conn->prepare($q2) ) {
    $stmt->bind_param("ss", $username, $password);
    $stmt->execute();
    $stmt->close();

    $result++;

}
else {
    echo json_encode("Failed to add user and password to database");
}

echo json_encode($result);

$conn->close();

?>

提前致谢。

【问题讨论】:

  • create.php 正在使用 $un 和 $hash,但我没有看到它们在任何地方设置。
  • @ChrisG 修复了这个问题,试图使其尽可能匹配 verify.php,但由于我测试了与 verifyUN 相同的确切代码,这两种方式都不起作用
  • 我的建议是通过创建一个简单的<form method="post"> 在不使用 AJAX 的情况下测试您的 PHP 代码。一旦您的 PHP 代码工作正常,请继续使用 AJAX。初学者总是同时做这两件事,犯错别字或其他简单的错误,然后卡住并浪费每个人的时间。 (无意冒犯)
  • 这就是为什么 if (!isset) 在那里,设置 post 变量并从那里测试的原因。仅在运行 create.php 文件时成功运行。当我引入另一个文件/ajax时它被注释掉了
  • 好的,然后将错误处理添加到create()的$.post

标签: javascript php jquery ajax .post


【解决方案1】:

我相信,问题在于 php 脚本 create.php,而且很可能在于未声明变量 $un 和 $hash

这两个 sql 语句是相关的,所以使用 prepare 方法的返回值来继续处理或完全放弃 - 真正的代码应该/将会比下面显示的更干净,但你应该明白

<?php

    $result = false;
    $username = !empty( $_POST['login'] ) ? $_POST['login'] : false;
    $password = !empty( $_POST['password'] ) ? $_POST['password'] : false;

    if( !$username or !$password )exit('bad foo');

    require '../database/info.php';

    $dbname = "test";

    $conn = new mysqli($servername, $username, $password, $dbname);
    if($conn->connect_error) die("connection not created: ". $conn->connect_error);




    $q1 = "insert into `user` ( `username` ) values (?)";
    $q2 = "insert into `security` ( `username`, `shpassword` ) values (?, ?)";

    $stmt=$conn->prepare( $q1 );
    if( $stmt ) {

        $stmt->bind_param("s", $username);
        $stmt->execute();
        $stmt->close();

        $stmt = $conn->prepare( $q2 );
        if( $stmt ){

            /* assumed algorithm here is default */
            $hash=password_hash( $password, PASSWORD_DEFAULT );

            $stmt->bind_param("ss", $username, $hash );
            $stmt->execute();
            $stmt->close();
        } else {
            exit('all is lost-abandon ship');
        }
        $conn->close();
    } else {
        exit('prepare failed');
    }
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多