未定义的返回值

时间:2019-05-15 16:08:56

标签: javascript php

我想使用JS和PHP从MySQL数据库中获取数据(没有jquery或ajax) 但是我一直收到“未定义的返回值错误”。

这是我第一次使用JS和PHP编程。

url: "../PHP/Kassensystem.php?productname="+productname

JS:

function getProduct(url) {

let product;

var request = new XMLHttpRequest();
request.open("GET", url, true);
request.onload = function () {
    if (request.status == 200) {
        product = request.responseText;
    }
};
request.send(null);

return product;
}

PHP:

<?php
$productname = $_GET['productname'];
$servername = 'localhost';
$username = 'root';
$password = '';
$dbname = 'allgolddb';

$conn = mysqli_connect($servername, $username, $password, $dbname);
$prodctInfos = array();

$sql = "SELECT * FROM products WHERE name = '$productname'";

$result = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($result)) {
  $prodctInfos[] = $row;
}

$json_array = json_encode($prodctInfos);
return $json_array;
?>

1 个答案:

答案 0 :(得分:0)

在您的open方法中,您将第3个参数设置为true,因此您的request.send将被异步执行。与所有异步JavaScript一样,到您的代码执行到达return product product时,仍然是undefined,因此出现错误。

您可以将第三个参数设置为false以使其同步,并且您的代码可以正常工作(到目前为止,至少在Firefox中工作):

request.open("GET", url, false);

但是不建议使用sync选项。来自MDN

  

主线程上的同步请求很容易破坏用户体验,应该避免;实际上,许多浏览器已完全弃用主线程上的同步XHR支持。允许在Worker中进行同步请求。

对于异步工作,您必须在onload方法的回调中使用:

request.onload = function () {
  if (request.status == 200) {
    product = request.responseText;
    console.log(product) // consume here
  }
};

您还可以将Promiseasync/await一起使用。更多here可用于异步代码。