Нет ответа JSON с удаленного веб-сервера в веб-форму HTML - PullRequest
0 голосов
/ 03 июля 2019

Я программист-любитель, поэтому, пожалуйста, будьте милы: -)

Я пытался (часами и часами!) Разработать веб-форму, которая при отправке одного элемента формы (например, номера сотрудника) извлекает данные с удаленного веб-сервера SQL и заполняет другие поля веб-страницы. (например, имя, адрес, номер телефона и т. д.). Все довольно обычные вещи, и я пытался принять и адаптировать многочисленные примеры из StackOverflow.

Подходом является HTML-форма для сбора EmployeeID, javascript getJSON для запроса данных через скрипт php удаленного сервера, который подключается к базе данных SQL, запрашивает базу данных, создает возвращаемый массив и json_encodes-кодирует его обратно в веб-форму.

Постоянная проблема заключается в том, что данные не передаются обратно в веб-форму и поэтому не заполняют другие поля.

Итак, я искал и нашел учебник, в котором был загружаемый «рабочий» пример кода (подтверждение https://www.electrictoolbox.com/json-data-jquery-php-mysql/).. Этот пример заполняет опции выбора сорта, когда фрукт выбран, и очень прост в своем подходе к кодированию. используя это, чтобы заставить работать базовую функциональность, но даже этот простой код не хочет играть красиво :-) Я уверен, что это что-то простое, но я просто не могу найти проблему.

Я изменил соединение с базой данных SQL с PDO на Mysqli, поскольку не мог заставить PDO вообще работать с SQL Server.

Я ожидаю, что в форме будут отображаться элементы в раскрывающемся списке «Разнообразие», извлеченные из базы данных, в соответствии с типом фруктов.

Вот файл fruit.html с Javascript:

<!doctype html>
<html>

<head>
<title>Untitled 1</title>
</head>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

<script type="text/javascript">

function populateFruitVariety() {

    $.getJSON('https://mysite.com.au/Secure/fruit-varieties.php', {fruitName:$('#fruitName').val()}, function(data) {
        var select = $('#fruitVariety');
        var options = select.prop('options');
        $('option', select).remove();

        $.each(data, function(index, array) {
            options[options.length] = new Option(array['variety']);
        });

    });
}

$(document).ready(function() {
    populateFruitVariety();
    $('#fruitName').change(function() {
        populateFruitVariety();
    });
});

</script>

<body>

    <form name="testfruit" onsubmit="populateFruitVariety();">

    Fruit: <select id="fruitName" name="name">
    <option>Apple</option>
    <option>Banana</option>
    <option>Orange</option>
    <option>Pear</option>
    </select> Variety: <select id="fruitVariety" name="variety"></select>
    <input type="submit" name="submit" value="Search">
</form>


</body>

</html>

и вот тот файл fruit-variety.php, который работает на удаленном сервере SQL:

<?php


    // Connect using SQL Server Authentication.   
    $con = mysqli_connect($serverName, $username, $password); 
        if (!$con) { 
            echo 'Unable to connect to SQL server: ' . mysqli_error();
            die('Unable to connect to SQL server: ' . mysqli_error()); 
        } 

    // Select database
    mysqli_select_db($con,$databaseName);
        if (!$con) { 
            echo 'Unable to open database: ' . mysqli_error(); 
            die('Unable to open database: ' . mysqli_error()); 
        } 

    $fruitName = $_GET['fruitName'];
    echo $fruitName.'|';
    $rows = array();

    if(isset($_GET['fruitName'])) {
        $sql= "SELECT variety FROM fruit WHERE name = '$fruitName' ORDER BY variety";

        $rows = mysqli_fetch_assoc(mysqli_query($con, $sql));
        if (!$con) { 
            echo 'Query failed: ' . mysqli_error(); 
            die('Query failed: ' . mysqli_error()); 
        } 
    }
    echo json_encode($rows);

?>

и, наконец, вот конструкция базы данных SQL и примеры данных:

SQL to create the table and populate with example data

CREATE TABLE IF NOT EXISTS `fruit` (
  `fruit_id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  `variety` varchar(50) NOT NULL,
  PRIMARY KEY  (`fruit_id`)
);

INSERT INTO `fruit` (`fruit_id`, `name`, `variety`) VALUES
(1, 'Apple', 'Red Delicious'),
(2, 'Pear', 'Comice'),
(3, 'Orange', 'Navel'),
(4, 'Pear', 'Bartlett'),
(5, 'Orange', 'Blood'),
(6, 'Apple', 'Cox''s Orange Pippin'),
(7, 'Apple', 'Granny Smith'),
(8, 'Pear', 'Anjou'),
(9, 'Orange', 'Valencia'),
(10, 'Banana', 'Plantain'),
(11, 'Banana', 'Burro'),
(12, 'Banana', 'Cavendish');

Спасибо всем - очень ценю любую помощь, которую вы можете мне оказать!

Приветствие ... Стив

1 Ответ

1 голос
/ 03 июля 2019

ЧИСТЫЙ РЕДАКТИРОВАТЬ: Я полностью пропустил часть jQuery, где вы отправляете собственное тело. В любом случае, ваша проблема - это часть echo $fruitName.'|';. Когда вы что-то выводите, это отправляется как ответ, что означает, что оно никогда не попадет в часть запроса к базе данных.

Вот рабочий код с подготовленными утверждениями в стиле mysqli:

<?php

$host = HOST;
$username = USERNAME;
$password = PASSWORD;
$databaseName = DB;

// Connect using SQL Server Authentication.   
$con = new mysqli($host, $username, $password, $databaseName);
if ($con->connect_errno) {
    die('Unable to connect to SQL server: ' . $con->connect_error);
}

$fruitName = $_GET['fruitName'];
$rows = [];

if (!empty($fruitName)) {
    $sql = "SELECT variety FROM fruit WHERE name = ? ORDER BY variety";
    $stmt = $con->prepare($sql);

    if (!$stmt) {
        die("Failed to prepare statement: {$con->error}");
    }

    // since you're passing a string, the first argument is "s"
    $stmt->bind_param("s", $fruitName);

    if (!$stmt->execute()) {
        die("Failed to execute statement: {$stmt->errorInfo()}");
    }

    // bind the result to $result which equals a new row each fetch
    $stmt->bind_result($result);
    while ($stmt->fetch()) {
        $rows[] = $result;
    }

    echo json_encode($rows);
}

$con->close();

Способ PDO:

<?php

$host = HOST;
$username = USERNAME;
$password = PASSWORD;
$databaseName = DB;

$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];
$con = new PDO("mysql:host=$host;dbname=$databaseName", $username, $password, $options);

$fruitName = $_GET['fruitName'];
$rows = [];

if (!empty($fruitName)) {
    $sql = "SELECT variety FROM fruit WHERE name = :name ORDER BY variety";
    $stmt = $con->prepare($sql);

    // bind $fruitName directly in the execute
    // note that you can, but don't have to, use : in here
    try { $stmt->execute(["name" => $fruitName]); }
    catch(PDOException $e) {
        die("Failed to execute statement: {$e->getMessage()}");
    }

    while (($row = $stmt->fetch(PDO::FETCH_COLUMN))) {
        $rows[] = $row;
    }

    echo json_encode($rows);
}

$con = null;

Обратите внимание, что на производстве вы никогда не выдадите ошибку непосредственно пользователю, особенно когда речь идет о вещах, связанных с базой данных. Для вещей, которые генерируют исключения, вам нужно их перехватить, отправить 50-кратный код состояния и зарегистрировать ошибку. Вам также необходимо настроить сервер так, чтобы после этого пользователи отправлялись на соответствующую страницу. Пример для исключений PDO:

try {
    $stmt->execute(["name" => $fruitName]);
} catch (PDOException $e) {
    http_response_code(500);
    error_log($e->getMessage());
    die();
}

Для вещей, которые не генерируют исключения, вы создаете пользовательский обработчик исключений, который делает что-то похожее на вышеприведенное, и вместо этого выбрасываете его.

Наконец, измените $.each() часть на:

$.each(data, function(index, item) {
    options[options.length] = new Option(item);
});

и все должно работать.

Еще одна вещь: убедитесь, что вы включили расширение, которое собираетесь использовать в файле php.ini , удалив точку с запятой перед ним. Вы также должны перезапустить PHP, PHP-FPM, Apache или все, что у вас есть после этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...