require_once "Constants.php";
require_once "database.php";
require_once "fun_class.php";
$fun_class = new fun_class();
$database = new database();
$myConnection = $database->connect_database(SERVER,USER,PASSWORD,DATABASE);
У меня это в верхней части страницы (заголовок area-, потому что у меня происходит сеанс), а затем у меня есть вторая вкладка открытия и закрытия php в том месте, где предполагается заполнение:
<select>
<?php
$fun_class->fillDropDownCategory($myConnection);
?>
</select>
В моей fun_class.php у меня есть эта функция:
function fillDropDownCategory($mysqli) {
echo " 1 ";
$display_block = "";
//Call Stored Procedure
if ($result = $mysqli->query("call rb_selectCategory()")) {
echo " 2 ";
// If there are no contacts returned
if ($result->num_rows < 1) {
//no records
echo " 3 ";
$display_block .= "<p><em>Sorry, no records to select!</em>
</p>";
} else {
echo " 4 ";
// For each record returned populate the select list
while ($recs = $result->fetch_object()) {
$id = $recs['category_id'];
$display_name = stripslashes($recs['name']);
$display_block .= "<option value=\'" . $id . "\'>" .
$display_name . "</option>";
}
}
//free result
$result->free();
//Get the last id entered - needed for the other tables
echo " 5 ";
//So you can run another stored proedure after a select
$mysqli->next_result();
}
else
{
echo " 6 ";
$display_block .= "<p><em>Sorry, no records to select!</em></p>";
}
echo " 7 ";
return($display_block);
}
Когда я вхожу на страницу, выбор пуст, и когда я вхожу в исходный код сайта, я вижу это:
<select>
1 6 7
</select>
Который является результатом моего отладочного эха
Моя хранимая процедура:
BEGIN
SELECT category_id, name AS name
FROM xxx.category
ORDER BY name;
END
при выполнении (в phpmyadmin) он возвращает две таблицы с именем category_id с идентификатором, а второй - именем и имеет имена категорий, которые присваиваются идентификаторам.
Я новичок в php и, вероятно, что-то не так с моей функцией, но из-за отсутствия опыта я не могу найти ошибку.
Поскольку вам нужно напечатать эту строку в HTML, вам нужно использовать такие функции, как echo
. В вашей функции fillDropDownCategory()
вы эхом fillDropDownCategory()
что-то (например, echo " 1 ";
), но в конце вы возвращаете переменную.
Эта переменная не будет напечатана только потому, что она возвращается, поэтому вам нужно распечатать ее, просто сделав
<select>
<?php
echo $fun_class->fillDropDownCategory($myConnection);
?>
</select>
Конечно, вы также должны удалить свои echo
вызовы в fillDropDownCategory()
чтобы избежать печати некоторых нежелательных строк в HTML.
<select>
затем показывает Fatal error: Cannot use object of type stdClass as array in C:\xampp\htdocs\xxx\fun_class.php on line 46
. Строка 46 - это $id = $recs['category_id'];
внутри пока цикл. Спасибо за подсказку с echo
я буду помнить это в будущем!
mysqli_result::fetch_object()
фактически возвращает экземпляр stdClass
поэтому вам нужно извлекать значения ООП (например, $recs->category_id
) или просто использовать mysqli_result::fetch_assoc()
чтобы получить результат в виде ассоциативного массива.
я имел
$id = $recs['category_id'];
$display_name = stripslashes($recs['name']);
изменил его на
$id = $recs->category_id;
$display_name = stripslashes($recs->name);
Спасибо всем за попытку!
$result = $mysqli->query("call rb_selectCategory()"); //Call Stored Procedure if ($result = $mysqli->query("call rb_selectCategory()")) {
вы делаете это дважды; это не обязательно и может быть причиной проблемы.$result = ...
без него, чтобы посмотреть, сработает ли это. Забыл вынести это спасибо.