Я вижу, что это было задано несколько раз, но, следуя всем другим нитям, я ничуть не стал. Я пытаюсь заполнить выпадающее меню из базы данных, но я продолжаю получать пустоту. Я клянусь, что это потому, что я ошибаюсь.
<select name="Verb List">
<?php fillVerblist($dbc); ?>
</select>
<?php
function fillVerblist($dbc) {
mysqli_query($dbc, 'SET NAMES UTF8');
$sql = mysqli_query($dbc, "SELECT * FROM verblist WHERE form = 'F'");
while ($row = mysql_fetch_assoc($sql)){
echo' <option value="verblist">'.$row['specificColumn'].'</option>';
}
}
?>
Спасибо!
В соответствии с руководством PHP: mysql_fetch_assoc()
устарел в PHP 5.5.0, поэтому используйте mysqli_fetch_assoc()
Если вы хотите, чтобы каждое значение параметра соответствовало отображаемому тексту, выполните следующие действия:
while ($row = mysqli_fetch_assoc($sql)){
echo' <option value="'.$row['specificColumn'].'">'.$row['specificColumn'].'</option>';
}
Как указано в комментариях DontPanic, вы также можете опустить атрибут value, и текст будет использоваться как значение.
Чтобы отладить пустой выбор, добавьте его внутри цикла while:
echo '<pre>';
echo $row;
echo '</pre>';
Это скажет вам, что возвращается из вашей базы данных, и если ваши данные/запрос неверны.
Потребовалось немного времени, чтобы написать, но простой класс, подобный приведенному ниже, упростил бы все создание избранных меню - просто введите разные параметры и выйдет из другого меню. Наиболее распространенное использование DOMDocument
как правило, заключается в анализе документа - будь то XML или HTML, но его методы отлично подходят для создания контента "на лету" - в этом случае простое меню выбора, которое является технически правильным в DOM.
<?php
class selectmenu{
private $dbo;
private $name;
private $sql;
public function __construct( $dbo, $name, $sql ){
$this->dbo=$dbo;
$this->name=$name;
$this->sql=$sql;
}
public function create(){
$result=$this->dbo->query( $this->sql );
if( $result ){
$dom=new DOMDocument;
$select=$dom->createElement('select');
$dom->appendChild( $select );
$attr=$dom->createAttribute( 'name' );
$attr->value=$this->name;
$select->appendChild( $attr );
while( $rs = $result->fetch_object() ){
/*
The option value is the ID and the innerHTML is
whatever column name is designated as 'value' in the
query. The names of these are fairly arbitary - you
could call them anything really in the query but change
the field here( ie: $rs->value to $rs->somecolumn )
*/
$option=$dom->createElement('option');
$option->nodeValue=$rs->value;
$attr=$dom->createAttribute( 'value' );
$attr->value=$rs->id;
$option->appendChild( $attr );
$select->appendChild( $option );
}
return $dom->saveHTML();
}
return 'error';
}
}
И чтобы использовать класс, вы бы сделали что-то подобное.
$dbhost = 'localhost';
$dbuser = 'root';
$dbpwd = 'xxx';
$dbname = 'xxx';
$db=new mysqli( $dbhost, $dbuser, $dbpwd, $dbname );
/* the column 'Name' is aliased as 'value' */
$sql_city="select 'id', 'Name' as 'value' from 'city' limit 20;";
$name_city='city';
/* note column aliases !! */
$sql_country="select 'code' as 'id', 'Region' as 'value' from 'country' limit 20;";
$name_country='country';
$obj=new selectmenu( $db, $name_city, $sql_city );
$city=$obj->create();
$obj=new selectmenu( $db, $name_country, $sql_country );
$country=$obj->create();
echo $city, $country;
?>
Та же идея может быть выполнена с помощью PDO, но методы должны быть соответствующим образом изменены.
Более конкретно для исходного вопроса
$sql="SELECT 'col' as 'id', 'othercol' as 'value' FROM verblist WHERE form = 'F'";
$name='verblist';
$obj=new selectmenu( $dbc, $name, $sql );
$menu=$obj->create();
echo $menu;