Код Javascript и PHP больше не работает после добавления параметра bind_parameter для предотвращения SQL-инъекции

Я создал код, который извлекает данные из БД с помощью ajax и Json в Javascript и PHP. В конце раскрывающийся список заполняется данными из запроса. Он работал нормально, пока я не добавил функции bind_parameter для предотвращения SQL-инъекции. Есть идеи, что я здесь делаю не так?

JavaScript:

function getCompetitie()
{
   seizoen = $("#Seizoen-text").val();
$.ajax({
    type:'POST',
    url:'get_competitie.inc.php',
    dataType: 'json', 
    data: {seizoen: seizoen},
    success: function(response){
        $("#Competitie-list").empty();
        $("#Competitie-list").append("<option>Competitie</option>");
        var len = response.length;
        alert(len);
        for(var i = 0; i < len; i++){
            var comp = response[i]['Competitie'];
            $("#Competitie-list").append("<option value='"+comp+"'>"+comp+"</option>");
        }
    }
});
}

Код PHP БЕЗ параметров привязки (отлично работает):

<?php
include "includes/dbh.inc.php";

$sql = "SELECT DISTINCT Competitie FROM kalender WHERE Seizoen='".$_POST['seizoen']."' ORDER BY Seizoen DESC;";    

$result = mysqli_query($conn, $sql);

$result_array = array();

while($row = mysqli_fetch_array($result)){
    $competitie = $row['Competitie'];
    $result_array[] = array("Competitie"=>$competitie);
}
echo json_encode($result_array);

?>

PHP-код с параметрами привязки (не работает):

<?php

include "includes/dbh.inc.php";
$seiz= $_POST['seizoen'];
if (empty($seiz)) {
    exit ();
}
else {
    $sql = "SELECT DISTINCT Competitie FROM kalender WHERE Seizoen=? ORDER BY Seizoen DESC;";    
    $stmt = mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt,$sql)) {
        exit ();
    }
    else {
        mysqli_stmt_bind_param($stmt, "s", $seiz);
        mysqli_stmt_execute($stmt);
        $result = mysqli_stmt_get_result($stmt);
        if ($row = mysqli_fetch_assoc($result)) {
            $result_array = array();
            while($row = mysqli_fetch_assoc($result)){
                $result_array = array();
                $seizoen = $row['Seizoen'];
                $result_array[] = array("Seizoen"=>$seizoen);
            }
            mysqli_stmt_close($stmt);
            echo json_encode($result_array);
        }
        else {
            exit ();                    
        }
    }
}

?>

Кажется, я получаю только «undefined» в раскрывающемся списке. Есть ли у кого-нибудь предложение, где я ошибся? Заранее спасибо!

Вы также не нажимаете первую строку, которую вы извлекаете, на $result_array

Patrick Q 29.11.2018 21:14

Или, возможно, из-за нового array("Seizoen"=> вместо array("Competitie"=>. «Не работает» - бесполезное описание проблемы. По крайней мере, посмотрите на сгенерированный вывод или добавьте вызовы var_dump, чтобы сузить число неудач.

mario 29.11.2018 21:14

Я думаю, что $row['Seizoen']; был бы более серьезной проблемой, поскольку он не извлекается из базы данных.

miken32 29.11.2018 21:16

Также стоит упомянуть, что ваш код можно было бы сократить примерно до 5 строк, если бы вы использовали PDO. Это гораздо менее многословно, особенно при работе с подготовленными операторами.

miken32 29.11.2018 21:17

Miken32, я вообще с PDO не знаком. Есть предложения, как тогда будет выглядеть код? Или где найти какой нибудь мануал? Спасибо !

Peter Verreyde 29.11.2018 21:35

Там же, где вы (надеюсь) нашли руководство для mysqli. php.net/manual/en/pdo.prepared-statements.php

miken32 29.11.2018 21:41

@ Miken32 Спасибо! Теперь это кристально ясно!

Peter Verreyde 29.11.2018 21:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы выбираете столбец Competitie в $sql = "SELECT DISTINCT Competitie..

Итак, исправим это:

//if ($row = mysqli_fetch_assoc($result)) { //remove this line
$result_array = array();
while($row = mysqli_fetch_assoc($result)){
    $competitie = $row['Competitie'];
    $result_array[] = array("Competitie"=>$competitie);
}
mysqli_stmt_close($stmt);
echo json_encode($result_array);

Или также выберите столбец Seizoen.

И исправление для удаления строки, сбрасывающей массив в каждом цикле.

Felippe Duarte 29.11.2018 21:17

@ miken32 это не опечатка, это нидерландский язык :-D

digijay 29.11.2018 21:25

Спасибо, Фелиппе. Это работает как шарм! Как ни странно, он работал без привязки параметров. В любом случае, спасибо за миллион!

Peter Verreyde 29.11.2018 21:34

Другие вопросы по теме