waar is de fout in mijn code?

Status
Niet open voor verdere reacties.

apcmvw

Gebruiker
Lid geworden
7 feb 2012
Berichten
80
Ik probeer te communiceren met mijn XAMPP database "bandleden"'
Met het volgende script probeer ik de inhoud van de database zichtbaar te maken. Dat lukt niet. Het scherm laat alleen twee kolommen zien met "voornaam""en "achternaam" en daaronder verschijnen dan 14 lege vakjes. Op zich klopt het dat er 14 namen in de database voorkomen.
Wat is er mis met deze code:

PHP:
<?php

$username="root";
$password="";
$database="bandleden";
$host="localhost";
 

$con = mysql_connect($host,$username,$password)
 or die(mysql_error());

mysql_select_db($database)
	or die(mysql_error());


$query="SELECT * FROM bandleden";
$result=mysql_query($query);

$num=mysql_numrows($result); 

mysql_close();



?>
     

    <table border="1" >
<tr> 
<th>voornaam</th>
<th>achternaam</th>

</tr>

<?php
$i=0;
while ($i < $num) {
	
	
	
	
$voornaam=mysql_result($result,$i,"voornaam");
$achternaam=mysql_result($result,$i,"achternaam");

?>

<tr> 
<td><? echo "$voornaam"; ?></td>
<td><? echo "$achternaam"; ?></td>

</tr>
<?php
++$i;
} 



?>
</table>
 
Pas regel 48 en 49 even een klein beetje aan:

Code:
<td><? echo $voornaam ?></td>
<td><? echo $achternaam ?></td>

Om het allemaal nog iets simpeler te houden :

Code:
while ($row = mysql_fetch_array($result)){
   echo'<tr>
             <td>
                 '.$row['voornaam'].'
             </td>
             <td>
                 '.$row['achternaam'].'
             </td>
          </tr>';

Op deze manier ben je de teller kwijt die je records bij houdt.
Je ben er ook zeker van dat altijd alle records doorlopen worden.
Je schakelt minder om tussen HTML en PHP
Je hebt beduidend minder code nodig voor hetzelfde resultaat.
 
Laatst bewerkt:
Hi gast0158,
Het spijt me maar jouw beide oplossingen krijg ik niet aan de gang. Als ik jouw aanpassingen van de regels 48 en 49 toepas verandert er niets!
Ik prefereer eigenlijk de eerste manier van werken want dan begrijp ik tenminste nog een beetje wat ik aan het doen ben. Op de tweede "array-manier" raak ik het spoor bijster. Als je dus de eerste manier voor me aan het werk kan krijgen: Graag!
Toon
 
Krijg je ook helemaal nergens foutmeldingen ?

Wanneer ik naar jouw code kijk, pas dan ++$i op regel 53 even aan en maak daar $i++ van, dat zou kunnen schelen.
Verbaas mezelf wel dat je wel 14 regels krijgt, alleen inhoudloos.


Ik wil best mijn 2e manier even uitleggen hoor :)

met while $row = mysql_fetch_array($result)

kijk ik net zo lang of er nog meer regels in je mysql result zitten tot alle regels voorbij zijn gekomen.
Iedere regel komt in de variabele $row terecht, welke dus steeds overschreven wordt. $row is een array welke de inhoud van een tabel-regel bevat.

Vervolgens schrijf ik met het echo commando iedere regel naar het scherm inclusief de gegevens uit de variable $row, dus de regel uit de database.

Ik zag trouwens dat de afsluitende accolade van de While-loop ontbreekt in de 2e code. Kijk even wat er gebeurd wanneer je die toe voegt na </tr>'; .

Dit is overigens ook de reden dat het mij verbaast wanneer je geen foutmelding zou krijgen. Naar mijn idee zou je ook op de eerder genoemde ++$i uit je eigen code een foutmelding moeten krijgen.

Succes,
 
Misschien komt het omdat op regel 21 mysql_close() aangeroepen wordt en op regel 42 en 43 wordt nog met een mysql_* functie gewerkt?

Error reporting aanzetten zou handig zijn inderdaad, helemaal als je aan het ontwikkelen bent. Niets zo vervelend als geen informatie :)

How do I enable error reporting in PHP
 
"
met while $row = mysql_fetch_array($result)

kijk ik net zo lang of er nog meer regels in je mysql result zitten tot alle regels voorbij zijn gekomen.
"

vervang mysql_fetch_array() door mysql_fetch_assoc, anders krijg je ook numerieke indexes en dat wil je niet.



"Misschien komt het omdat op regel 21 mysql_close() aangeroepen wordt en op regel 42 en 43 wordt nog met een mysql_* functie gewerkt"

Exact. De verbinding is al weg voordat de resultaten daadwerkelijk worden opgehaald en omdat er daarna nergens meer wordt gekeken of er uberhaupt nog wel records worden teruggegeven door mysql_result() print je dus "blind" een aantal rijen met niets erin.


mysql_result() moet je sowieso liever niet gebruiken, het is onhandig en traag. mysql_fetch_assoc() is veel efficienter en uiteindelijk handiger.
 
Beste helpers,
Ik probeer me nu even te concentreren op de oorspronkelijke code die niet blijkt te werken. Ook niet nadat ik mysql_close() naar beneden heb verplaatst. Het resultaat is nog steeds hetzelfde. voor de volledigheid hierbij nog een keer de gebruikte code:
PHP:
<?php

$username="root";
$password="";
$database="bandleden";
$host="localhost";

$con = mysql_connect($host,$username,$password)
 or die(mysql_error());

mysql_select_db($database)
	or die(mysql_error());

$query="SELECT * FROM bandleden";
$result=mysql_query($query);

$num=mysql_numrows($result); 

?>

<table border="1" >
<tr> 
<th>voornaam</th>
<th>achternaam</th>
</tr>

<?php
$i=0;
while ($i < $num) {
	
$voornaam=mysql_result($result,$i,'voornaam');
$achternaam=mysql_result($result,$i,'achternaam');

?>

<tr> 
<td><? echo "$voornaam" ?></td>
<td><? echo "$achternaam" ?></td>
</tr>

<?php
$i++;
} 

mysql_close();

?>

</table>

Het vervangen van ++$i; door $i++; had ook geen effect (ook geen foutmelding trouwens!)
Volledigheidshalve voeg ik hier ook een screenprint toe van het resultaat dat ik op mijn scherm krijg zonder enig foutmelding overigens).screenprint final_index.jpg
Tenslotte voeg ik ook een screenprint van de betreffende database toe (mogelijk dat daar iets fout zit?! screenprint bandleden.jpg

Wie kan me helpen?
 
Ik gebruik altijd mysqli, is de nieuwe manier en word ook aangeraden op php.net (dit zal je niet verder helpen maar even ter info ;) )
Probeer je sql query eens uit in pma, en? Kloppen alle hoofdletters van de kolomnamen?
Je ziet geen errors, maar staat error reporting wel aan? Zet deze code eens bovenaan je pagina('s):
PHP:
error_reporting(E_ALL);
ini_set('display_errors', '1');
En nog error reporting voor sql:

PHP:
mysql_error($link)
($link moet de var zijn die je voor je connectie gebruikt. Zet deze code in een echo achter iedere query).
 
Martijn 12321, Je eerste stuk code heb ik toegevoegd en dat leidt (gelukkig!?!) tot enkele foutmeldingen te weten:
-"Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in C:\xampp\htdocs\final\index.php on line 13"
en
"Warning: mysqli_select_db() expects exactly 2 parameters, 1 given in C:\xampp\htdocs\final\index.php on line 16"
Mijn probleem is nu echter dat ik niet weet wat te doen!
Bij het tweede stuk code wat je me voorstelt weet ik niet welke var ik voor mijn connectie gebruik. Kan jij dat mogelijk uit mijn eerder gezonden code afleiden?
 
Ik heb even een testje gedaan met de versie zoals jij die het laatste geplaatst hebt en tot mijn verbazing kreeg ik meteen een tabel MET inhoud te zien.

Ik ga nu bijna denken dat er ergens iets gebeurd met de opmaak en dat de tekstkleur gelijk is aan de achtergrondkleur van de TD's.

Onderstaand de code zoals ik deze bedacht had, in mijn code heb ik de tekst rood geforceerd en de achtergrond heb ik geel geforceerd.
Onderstaande code is getest en werkt.

PHP:
<?php
 
$username="root";
$password="";
$database="bandleden";
$host="localhost";
 
$con = mysql_connect($host,$username,$password)
 or die(mysql_error());
 
mysql_select_db($database)
    or die(mysql_error());
 
$query="SELECT * FROM bandleden";
$result=mysql_query($query);

echo' 
<table border="1" >
	<tr> 
		<th>voornaam</th>
		<th>achternaam</th>
	</tr>';

	While ($row = mysql_fetch_array($result))	{
		echo'
			<tr style="color:red; background-color:yellow;"> 
				<td>'.$row['voornaam'].'</td>
				<td>'.$row['achternaam'].'</td>
			</tr>';
	}
echo'
<table>';
 
mysql_close();
 
?>

Succes,
 
Laatst bewerkt door een moderator:
Voor alle zekerheid hier ook og even de dump van de door mij gebruikte tabel :

Code:
-- phpMyAdmin SQL Dump
-- version 3.5.2.2
-- http://www.phpmyadmin.net
--
-- Machine: 127.0.0.1
-- Genereertijd: 29 nov 2013 om 12:42
-- Serverversie: 5.5.27
-- PHP-versie: 5.4.7

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

--
-- Databank: `bandleden`
--

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `bandleden`
--

DROP TABLE IF EXISTS `bandleden`;
CREATE TABLE IF NOT EXISTS `bandleden` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `voornaam` varchar(50) NOT NULL,
  `achternaam` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

--
-- Gegevens worden uitgevoerd voor tabel `bandleden`
--

INSERT INTO `bandleden` (`id`, `voornaam`, `achternaam`) VALUES
(1, 'Joke', 'Baar'),
(2, 'Kjeld', 'Bontenbal'),
(3, 'Hans', 'Burdorf'),
(4, 'Ellen', 'Dales'),
(5, 'Toon', 'van Winden'),
(6, 'Kees', 'Keesmans'),
(7, 'Piet', 'Pietersen'),
(8, 'lelele', 'shgsgsg');
 
Ik ga nu bijna denken dat er ergens iets gebeurd met de opmaak en dat de tekstkleur gelijk is aan de achtergrondkleur van de TD's.

dan druk je op Ctrl-U om de sourcecode van de pagina te bekijken :-)

mar vervang mysql-fetch_array door mysql_fetch_assoc, want je wilt nooit de numerieke array, alleen de associatieve array.
 
Ik zou echt niet weten waar het fout gaat, maar probeer deze code eens. Zo werk ik altijd en werkt eigenlijk altijd.
(Je moet natuurlijk nog even vars enzo aanpassen
PHP:
$connect = mysqli_connect($dtb_host, $dtb_user, $dtb_pass, $dtb_name);
$result = mysqli_query($connect, "SELECT * FROM bandleden");
echo "<table>";
while($arr = mysqli_fetch_array($result))
{echo "<tr>";
echo "<td>".$arr['voornaam']."</td>";
echo "<td>".$arr['achternaam']."</td>";
echo "</tr>";
}
echo "</table>";
Dit is met mysqli hoe het ook op w3schools beschreven staat.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan