Я создал код, который извлекает данные из БД с помощью 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» в раскрывающемся списке. Есть ли у кого-нибудь предложение, где я ошибся? Заранее спасибо!
Или, возможно, из-за нового array("Seizoen"=> вместо array("Competitie"=>. «Не работает» - бесполезное описание проблемы. По крайней мере, посмотрите на сгенерированный вывод или добавьте вызовы var_dump, чтобы сузить число неудач.
Я думаю, что $row['Seizoen']; был бы более серьезной проблемой, поскольку он не извлекается из базы данных.
Также стоит упомянуть, что ваш код можно было бы сократить примерно до 5 строк, если бы вы использовали PDO. Это гораздо менее многословно, особенно при работе с подготовленными операторами.
Miken32, я вообще с PDO не знаком. Есть предложения, как тогда будет выглядеть код? Или где найти какой нибудь мануал? Спасибо !
Там же, где вы (надеюсь) нашли руководство для mysqli. php.net/manual/en/pdo.prepared-statements.php
@ Miken32 Спасибо! Теперь это кристально ясно!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы выбираете столбец 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.
И исправление для удаления строки, сбрасывающей массив в каждом цикле.
@ miken32 это не опечатка, это нидерландский язык :-D
Спасибо, Фелиппе. Это работает как шарм! Как ни странно, он работал без привязки параметров. В любом случае, спасибо за миллион!
Вы также не нажимаете первую строку, которую вы извлекаете, на
$result_array