Почему первый php-файл возвращает неверную информацию, в то время как второй возвращает правильную информацию?

#php #json

#php #json

Вопрос:

Я новичок в php, и мне действительно не помешала бы некоторая помощь.

У меня есть php-файл, который возвращает запрошенную информацию в неправильном порядке или не возвращает ее вообще, изменяя переменные в php-файле, мне удается получить желаемые результаты.

И все же, как это возможно, учитывая следующие файлы?

Первый php-файл возвращает устаревшую ИНФОРМАЦИЮ

 <?php
    $con = mysqli_connect("localhost", "user", "password", "user");

    //$idquestion = @($_POST['idquestion']);
    //$category = @($_POST['category']);
    $idquestion="1";
    $category="computers";

    $statement = mysqli_prepare($con, "SELECT * FROM question WHERE idquestion=? AND category=?;");
    mysqli_stmt_bind_param($statement, "is", $idquestion,  $category);
    mysqli_stmt_execute($statement);

    mysqli_stmt_store_result($statement);
    mysqli_stmt_bind_result($statement, $success, $idquestion, $question, $id);

    $response = array();
    $response["success"] = false;

    while(mysqli_stmt_fetch($statement)){
        $response["success"] = true;
        $response["idquestion"] = $idquestion;
        $response["question"] = $question;
        $response["id"] = $id;
    }

    echo json_encode($response);
?>
  

Вывод

 {"success":true,"idquestion":"Top programming languages?","question":"computers","id":1}
  

И второй php-файл возвращает ПРАВИЛЬНУЮ ИНФОРМАЦИЮ

 <?php
    $con = mysqli_connect("localhost", "id8963226_user", "parola123", "id8963226_user");

    //$idquestion = @($_POST['idquestion']);
    //$category = @($_POST['category']);
    $idquestion="4";
    $category="computers";

    $statement = mysqli_prepare($con, "SELECT * FROM question WHERE idquestion=? AND category=?;");
    mysqli_stmt_bind_param($statement, "is", $idquestion,  $category);
    mysqli_stmt_execute($statement);

    mysqli_stmt_store_result($statement);
    mysqli_stmt_bind_result($statement, $success, $idquestion, $question, $id);

    $response = array();
    $response["success"] = false;
    $response["idquestion"] = $idquestion;

    while(mysqli_stmt_fetch($statement)){
        $response["success"] = true;
        $response["question"] = $idquestion;
        $response["id"] = $id;
    }

    echo json_encode($response);
?>
  

Вывод

 {"success":true,"idquestion":"1","question":"Top programming languages?","id":1}
  

Как логика, лежащая в основе первого php-файла, дала мне эти результаты?
В принципе, я хочу, чтобы ПОСЛЕДНИЕ РЕЗУЛЬТАТЫ работали без искажения кода.

Приветствуется любое мнение. Спасибо.

Комментарии:

1. В следующий раз, пожалуйста, четко объясните различия, сравнивать 2 блока кода по вертикали сложно…

2. Проблема в том, что мне нужно, чтобы вывод был idquestion = 1, question = top programming lang, id = 1

3. Как вы можете видеть, первый php возвращает idquestion = top programming lang, что совершенно неверно

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

5. Он не возвращает неверную информацию, вы неправильно ее кодируете

Ответ №1:

В вашем запросе, который вы используете SELECT * другими словами, вы позволяете Mysql возвращать все столбцы в порядке, который он определяет. Этот порядок, вероятно, будет порядком, в котором были определены столбцы, но в основном вы не контролируете порядок столбцов.

Также более эффективно запрашивать только те столбцы, которые вам действительно нужны в любом случае.

Итак, измените запрос на

 $statement = mysqli_prepare($con, "SELECT idquestion, question, id 
                                    FROM question 
                                    WHERE idquestion=? AND category=?;");
  

Теперь вы контролируете порядок возврата столбцов.

Итак, когда вы запускаете это

 mysqli_stmt_bind_param($statement, "is", $idquestion,  $category);
mysqli_stmt_execute($statement);

mysqli_stmt_store_result($statement);
mysqli_stmt_bind_result($statement, $idquestion, $question, $id);
  

Значения столбцов перейдут в правильные переменные.

Комментарии:

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

2. выбор каждой переменной решил проблему. большое спасибо