Ik heb het volgende stukje code:
//optional print a bold header at top of table
if ($header_bool)
{
print("<TR>");
for ($column_num = 0;
$column_num < $column_count;
$column_num++)
//var_dump ($column_num);
while ($field_name = mysqli_fetch_field($result_id)) {
print("<TH>$field_name</TH>");
}
print("</TR>\n");
}
krijg echter de melding:
Catchable fatal error: Object of class stdClass could not be converted to string in C:\wamp64\www\Oefenopgave15-2.php on line
Ik heb getracht te begrijpen wat deze melding inhoud. Helaas snap ik het blijkbaar niet goed. Hiierdoor snap ik ook niet waar ik in de code fout ga.

Wie wil mij het (in jip en janneke taal) uitleggen wat deze melding betekend en me misschien een hint geven waar in de code ik de misser heb gemaakt?
Om welke lijn gaat het?
En zou je code-tags willen gebruiken? Dat leest wat makkelijker.
Zie [php]mysqli_fetch_field[/php]. Uit deze functie komt een object terug, waar je nog een waarde uit wilt hebben. Objecten kunnen niet 1 op 1 worden geconverteerd van object naar string, tenzij er ergens een __tostring methode aan hangt. Je zult dus een keuze moeten maken welke waarde je wil zien.
Bedoel je dit - Ariën -:

<?php
//optional print a bold header at top of table
if ($header_bool)
{
print("<TR>");
for ($column_num = 0;
$column_num < $column_count;
$column_num++)
//var_dump ($column_num);
while ($field_name = mysqli_fetch_field($result_id)) {
print("<TH>$field_name</TH>");
}
print("</TR>\n");
}?>



Het gaat om de regel:

print("<TH>$field_name</TH>");{
?>


(sorry, ik moet nog veel leren hoor)

[size=xsmall]Toevoeging op 04/01/2018 21:12:35:[/size]

Ben van Velzen op 04/01/2018 20:51:37

Zie [php]mysqli_fetch_field[/php]. Uit deze functie komt een object terug, waar je nog een waarde uit wilt hebben. Objecten kunnen niet 1 op 1 worden geconverteerd van object naar string, tenzij er ergens een __tostring methode aan hangt. Je zult dus een keuze moeten maken welke waarde je wil zien.



Hai Ben, dank voor je antwoord.
wil je er vanuit gaan dat ik echt een beginneling ben. Ik begrijp dat er in de code iets zit wat geen string is maar een object. Ik "zie", begrijp, echter niet hoe dit kan.
Ik heb ook gezocht hoe ik dit kan converteren, maar ook daar ga ik de mist mee in.
Is fetchen met fetch_assoc() niet een beter alternatief?

Ik weet niet welke query er achter hangt, maar laat die eens zien? Misschien is die while() wel overbodig.
[code]
<!DOCTYPE HTML>

<meta charset="utf-8">
<html><head><title>Oefenopgave 15-2</title></head>
Code voor het weergeven van een tabel.<BR>
<?PHP
// Your code here
echo "<hr />\n".
"Aangemaakt op: (7 november 2017 20:43:30)<BR>\n";

include ("/home/phpbook/phpbook-vars.inc");
$connection = new mysqli($hostname, $username, $password, $db);
global $connection;
if ($connection->connect_errno) {
printf("Connect failed: %s\n", $connection->connect_error);
exit();
} else {
printf("Connected to database $db on server $hostname with login $username. \n");
}

function display_db_query($query_string, $connection, $header_bool, $table_params)
{
global $connection;
//perform the database query
$result_id = mysqli_query($connection, $query_string)
or die("display_db_query:". mysqli_error());
//var_dump ($result_id);
//var_dump ($query_string);
//find out the number of columns in result
$column_count = mysqli_fetch_row($result_id)
or die ("display_db_query:". mysqli_error());
//echo $column_count;
//var_dump ($result_id);
// var_dump ($column_count);
//TABLEform includes optional HTML arguments passed
//into function
print ("<TABLE $table_params >\n");


//optional print a bold header at top of table
if ($header_bool)
{
print("<TR>");
for ($column_num = 0;
$column_num < $column_count;
$column_num++)
//var_dump ($column_num);
while ($field_name = mysqli_fetch_field($result_id)) {
print("<TH>$field_name</TH>");
}
print("</TR>\n");
}

//print the body of the table
while ($row = mysqli_fetch_row($result_id)) {
print("<TR ALIGN=LEFT VALIGN=TOP>");
for ($column_num = 0;
$column_num < $column_count;
$column_num++)
{
print ("<TD>$row[$column_count]</TD>\n");
}
print("</TR>\n");
}
print("</TABLE>\n");
}

function display_db_table($connection, $header_bool, $table_params)
{
global $connection;
$query_string = "SELECT persons.PersonID, persons.Name, Persons.SS, fears.Fear
FROM persons
LEFT OUTER JOIN person_fear ON persons.PersonID = person_fear.PersonID
LEFT OUTER JOIN fears ON person_fear.FearID = fears.FearID";
display_db_query($query_string, $connection, $header_bool, $table_params);
}

?>


<!--<BODY>-->
<TABLE><TR><TD>
<?php
display_db_table($connection, TRUE, "BORDER=2");
?>
</TD>
<!--<TD>
<?php
display_db_table($connection, TRUE, "BORDER=2");
?>
</TD>-->
</TR></TABLE></BODY></HTML>
?>
[size=xsmall]Toevoeging op 04/01/2018 21:21:14:[/size]

de query is simpel:
SELECT persons.PersonID, persons.Name, Persons.SS, fears.Fear
FROM persons
LEFT OUTER JOIN person_fear ON persons.PersonID = person_fear.PersonID
LEFT OUTER JOIN fears ON person_fear.FearID = fears.FearID

Het is een onderdeel van een LOI opdracht:Schrijf een PHP-script dat de gegevens van alle personen op het scherm toont en van de personen die een fobie hebben, ook hun fobie. Gebruik hiervoor de tabellen in de database "Oefen". Geef ook de kolomkoppen weer.
Gebruik hiervoor als basis de code van listing 16-2, maar gebruik de mysqli-functies. Verwijder de overbodige elementen en zorg voor voldoende foutafhandeling.
Zet de functies in een apart PHP-bestand en pas de functie display_db_table aan zodat er geen $tablename wordt meegegeven, maar een gehele select string.
Let op: mysqli_field_name bestaat niet. Gebruik mysqli_fetch_field, zie www.php.net voor het gebruik hiervan.
Ik zit daardoor aan bepaalde voorwaarden vast hoe het eea opgebouwd moet worden.
$field_name is een beetje een misleidende naam, immers, je vraagt met je query meerdere kolommen (en rijen) op. $field_name is dus elke keer (elke iteratie van de while-loop) een setje gegevens (een record). Deze kun je daarom ook uberhaupt niet rechtstreeks weergeven, het is dan namelijk onduidelijk welke gegevens je precies wilt laten zien. Je zult dus -op zijn minst- aan moeten geven om welke kolom het gaat.

En mysqli_fetch_field is wellicht niet de beste functie voor de klus. Dit is namelijk een soort van functie voor het opvragen van metadata van een kolom, dus daarmee kom je alles te weten van zo'n kolom *behalve* de kolomwaarde, waar je waarschijnlijk in geïnteresseerd bent :).

Zoals @Ariën al zei - mogelijk is het handiger om gebruik te maken van de mysqli_fetch_* functies (maar dan de juiste :p zoals fetch_array, fetch_assoc of fetch_object). Mogelijk geeft de listing 16-2 waar je het hierboven over hebt hiertoe een schot in de goede richting?
Als je je aan de opdracht houdt is mysqli_fetch_field wel nuttig, omdat je de kolomnamen ook moet hebben.
@Jan op regel 49 gebruik je een object, omdat mysqli_fetch_field een object teruggeeft. Nogmaals, zie [php]mysqli_fetch_field[/php] voor een voorbeeld over het gebruik van dit object.
Toegegeven, als de HTML-tabel echt dynamisch moet worden opgebouwd kan dit handig zijn. Maar je zult nog steeds de waarde van een kolom van een record op een alternatieve manier moeten ophalen, omdat dat niet kan met mysqli_fetch_field() zelf, althans niet voor zover ik kan zien (?).

Maar het genereren van de header kun je net zo goed doen wanneer je de resultaten ophaalt middels fetch_assoc(), fetch_row() of fetch_object(). En dan heb je ook meteen concrete waarden, en niet enkel metadata.

Als een opdracht je iets voorschrijft wat niet leidt tot een oplossing (of tot een omslachtige terwijl er makkelijkere oplossingen zijn) dan lijkt mij de opdracht gewoon verkeerd :p.
mysqli_fetch_field kan geen waarden ophalen, dat is waar. Je kan er alleen metadata mee ophalen. Dus zit je daarna vast aan mysqli_fetch_assoc of een verwante functie.

Ik ben heel benieuwd naar de code die als naslag gegeven is, misschien dat daar meer duidelijkheid uit komt.
Excuses voor de wat vertraagde reactie. Ik doe dit in wat spaarsame momenten.
Hierbij listing 16-2
<?php
<!DOCTYPE HTML>

<meta charset="utf-8">
Code voor het weergeven van een tabel.<BR>
<?PHP
// Your code here
echo "<hr />\n".
"Aangemaakt op: (7 november 2017 20:43:30)<BR>\n";

include ("/home/phpbook/phpbook-vars.inc");
$global_dbh = mysql_connect ($hostname, $username, $password)
or die("Could not connect to database");

mysql_select_db($db, $global_dbh)
or die("Could not select database");

function display_db_query($query_string, $connection, $header_bool, $table_params)
{
//perform the database query
$result_id = mysql_query($query_string, $connection)
or die("display_db_query:". mysql_error());

//find out the number of columns in result
$column_count = mysql_num_fields($result_id)
or die ("display_db_query:". mysql_error());

//TABLEform includes optional HTML arguments passed
//into function
print ("<TABLE $table_params >\n");

//optional print a bold header at topm of table
if ($header_bool)
{
print("<TR>");
for ($column_num = 0;
$column_num < $column_count;
$column_num++)
{
$field_name =
mysql_field_name($result_id, $column_num);
print("<TH>$field_name<?TH>");
}
print("</TR>\n");
}
// print the body of the table
while ($row = mysql_fetch_row($result_id))
{
print("<TR ALIGN=LEFT VALIGN=TOP>");
for ($column_num = 0;
$column_num < $column_count;
$column_num++)
{
print ("<TD>$row[$column_num]<?TD\n");
}
print("</TR>\n");
}
print("</TABLE>\n");
}

function display_db_table($table_name, $connection, $header_bool, $table_params)
{
$query_string = "SELECT * FROM $table_name";
display_db_query($query_string, $connection, $header_bool, $table_params);
}
?>

<html><head><title>Cities and Countries: Nice table</title></head>
<BODY>
<TABLE><TR><TD>
<?php
display_db_table("country", $global_dbh, TRUE, "BORDER=2");
?>
</TD><TD>
<?php
display_db_table("city", $global_dbh, TRUE, "BORDER=2");
?>
</TD></TR></TABLE></BODY></HTML>
?>

Reageren