Zoals jullie wel weten heb ik vorige week een post aangemaakt rond het importeren van een database op een webpagina. Maar nu zou ik graag foto's importeren vanuit dezelfde database, deze foto's bevatten geen url, maar wel een pad. Bv: 000000-001000, maar het pad bij men 2 foto's zijn allebei hetzelfde. Dus het lijkt met niet echt logisch om hiermee verder te werken. Tenzij ik het verkeerd begrijp natuurlijk.

Ik zat eraan te denken om de foto's te importeren via hun ID bv 5 en 6. Ik heb al wat opgezocht, maar ik zit toch weer even vast. De kolom waarin de id nummers staan heet I_ID. Verder krijg ik op lijn 21 een foutmelding te zien dat er een undefined index is.


Dit is lijn 21:


$id = $_GET['I_ID'];




Dit is mijn volledige code:


<?php
include('connect-mysql.php');
$sqlget = "SELECT * FROM artikel, images";
$sqldata = mysqli_query($dbcon, $sqlget) or die('error getting');

$id = $_GET['I_ID'];
$query = "SELECT * FROM images WHERE `id`=$id";

echo "<table>";
echo "<tr><th>A_ARTCODE</th><th>A_NUMMER</th><th>A_OMSCHRN</th><th>A_REFLEV</th><th>A_WINKEL</th><th>I_ARTCODE</th><th>I_FILE</th></tr>";

while($row = mysqli_fetch_array($sqldata)){
	echo "<tr><td>";
	echo $row['A_ARTCODE'];
	echo "</td><td>";
	echo $row['A_NUMMER'];
	echo "</td><td>";
	echo $row['A_OMSCHRN'];
	echo "</td><td>";
	echo $row['A_REFLEV'];
	echo "</td><td>";
	echo $row['A_WINKEL'];
	echo "</td><td>";
	echo $row['I_ARTCODE'];
	echo "</td><td>";
	echo "<img src='index.php?id=".$row['I_ID']."' />";
	echo "</td></tr>";
	}
	
echo "</table>";
?>
Dat klopt maar de foutafhandeling maakt het voor mij tot nu toe nog te ingewikkeld. Daarom zou ik het liever aan de kant laten, totdat ik wel snap wat ik aan het doen ben. Maar dan snap ik nog altijd niet, hoe mijn collega met zijn script, meer ziet dan mij. Zelf al kopieer ik zijn volledige code, dan krijg ik hetzelfde resultaat te zien zoals ik voordien al had.
Foutafhandeling is niet zo ingewikkeld. Als je weet hoe if-else werkt, dan is een foutafhandeling zo in elkaar gezet. Voor een beginner in PHP is het geen rocket-science op deze manier. Hoewel je het zo complex kan maken met exeptions en classes, maar dat laat ik even achterwege ;)

Met foutafhandeling krijg je tevens een beter inzicht in waar je code vastloopt. Plus dat je code logischer en begrijpelijker opgebouwd is. Dus doe er gewoon een voordeel mee, zou ik zeggen.

Verder ligt het verschil tussen jouw en je collega hoogstwaarschijnlijk bij een verkeerd veld type in je database.
Als ik de dingen af heb, die ik zou willen hebben, dan stort ik me met alle plezier op die foutafhandeling ;) maar ik heb nu een beetje gebrek aan tijd.

Om nu even van de hak op de tak te springen, ik heb het zoeken naar die 'afbeeldingen' voorlopig even aan de kant gelegd. Ik begin nu even eerst met het opsplitsen van al men rijen per 20 voor 1 pagina. Ik volg momenteel deze tutorial: http://www.phpjabbers.com/php--mysql-select-data-and-split-on-pages-php25.html

Want deze houdt precies in, wat ik wil bereiken.

Dus als ik het goed begrijp zou ik gewoon die code moeten implementeren in het stuk die ik nu al heb (van daarnet). Maar ik doe ergens iets verkeerd. Zie jij toevallig waar ik verkeerd gelopen ben?


<?php
include('connect-mysql.php');
if (isset($_GET["page"])) { $page  = $_GET["page"]; } else { $page=1; }; 
$start_from = ($page-1) * 20;
$sqlget = "SELECT *
FROM artikel, images
LIMIT 0, 20
";

$sqldata = mysqli_query($dbcon, $sqlget) or die('error getting');

echo "<table>";
echo "<tr><th>A_ARTCODE</th><th>A_NUMMER</th><th>A_OMSCHRN</th><th>A_REFLEV</th><th>A_WINKEL</th><th>I_ARTCODE</th><th>I_FILE</th></tr>";

while($row = mysqli_fetch_array($sqldata)){
	echo "<tr><td align='right'>";
	echo $row['A_ARTCODE'];
	echo "</td><td align='left'>";
	echo $row['A_NUMMER'];
	echo "</td><td align='left'>";
	echo $row['A_OMSCHRN'];
	echo "</td><td align='left'>";
	echo $row['A_REFLEV'];
	echo "</td><td align='right'>";
	echo $row['A_WINKEL'];
	echo "</td><td align='right'>";
	echo $row['I_ARTCODE'];
	echo "</td><td align='right'>";
	echo $row['I_FILE'];
	//echo "<img src='000000-001000".$row['I_ID']."' />";
	echo "</td></tr>";
	}
	
echo "</table>";
?>
<?php
$sql = "SELECT COUNT(I_ID) FROM images"; 
$rs_result = mysql_query($sql,$dbcon);
$row = mysql_fetch_row($rs_result); 
$total_records = $row[0];

$total_pages = ceil($total_records / 20);

for ($i=1; $i<=$total_pages; $i++) { 
    echo "<a href='pagination.php?page=".$i."'>".$i."</a> "; 
};
?>


Wanneer ik mijn pagina test dan krijg ik 2 foutmeldingen op deze regels:


<?php
$rs_result = mysql_query($sql,$dbcon);
$row = mysql_fetch_row($rs_result);
?>
Waarom gebruik je nu de oude mysql_* functie i.p.v. mysqli_*?
En verder leg ik net uit waar foutafhandeling nou handig voor is, als je geen foutafhandeling hebt, weet je ook niet wat er mis gaat met je query.

Dus vanaf nu gewoon direct toepassen, en alles wordt duidelijker en de weg naar een werkend script wordt steeds helderder.
Wanneer ik mijn pagina test dan krijg ik 2 foutmeldingen op deze regels:


Komt een man bij de dokter: "dokter, ik kan iets niet met mijn arm"

Wat moet de dokter dan? Weer vragen wat er dan is wat hij niet kan, wat er dan precies gebeurt.
Kan een verlamming van de arm zijn.
Kan ook zijn dat hij zijn deur thuis niet open kan krijgen, omdat de vuilnisbak er voor staat....

Dus "ik krijgeen een foutmelding" zegt an sich helemaal niets...
@Aar: Ik volgde gewoon de tutorial, ik had er niet op gelet dat het mysql was. Ik kijk zo meteen voor een foutafhandeling, maar ik zie het gebeuren dat ik een hele dag eraan kwijt geraak om een goeie foutafhandeling te krijgen :(


@ivo p: Helpen deze 2 regels de dokter wat vooruit?

Warning: mysqli_query() expects parameter 1 to be mysqli, string given in C:\wamp\www\DBFact\index.php on line 53

Warning: mysql_fetch_row() expects parameter 1 to be resource, null given in C:\wamp\www\DBFact\index.php on line 54
Ik heb in mijn eerdere voorbeeld al een mooie foutafhandeling gebruikt. Dus waarom zou je dan nog een hele dag ermee lopen emmeren?

Dus bekijk mijn voorbeeld van gisteren eens (vanaf lijn 8), en lees de gele commentaar blokken zorgvuldig. Verder is er niks mis als je tutorials leest, maar als je meerdere gebruikt, let dan ook vooral op wat het doet, en hoe ze werken. Bijna geen enkele verschillende tutorial zal naadloos op elkaar aansluiten, dus weet wat je doet en hoe het werkt. Weet je iets niet, dan kan je dat opzoeken op www.php.net.
Met deze query:

SELECT * FROM artikel, images

krijg je aan ALLE artikelen uit de artikel tabel ALLE images uit de images tabel
Het is namelijk hetzelfde als:

SELECT * FROM artikel CROSS JOIN images

Zie hier

Aar maakt diezelfde fout in zijn voorbeeld, en op die manier joinen is niet (meer) volgens de SQL standaard.
Warning: mysqli_query() expects parameter 1 to be mysqli, string given in C:\wamp\www\DBFact\index.php on line 53


Is heel duidelijk toch?

Mysqli_query heeft 2 parameters nodig.
De eerste daarvan is (zoals de foutmelding en de handleiding zeggen) van het type mysqli, ofwel de "mysqli-connectie".

Dat is dus bijvoorbeeld
$myConn = mysqli_connect(........)

Dan gebruik je $myConn.

jij geeft een string. Ik gok de string "SELECT....."

[size=xsmall]Toevoeging op 03/06/2014 12:20:03:[/size]

Ivo P op 03/06/2014 12:17:05

Warning: mysqli_query() expects parameter 1 to be mysqli, string given in C:\wamp\www\DBFact\index.php on line 53


Is heel duidelijk toch?

Mysqli_query heeft 2 parameters nodig.
De eerste daarvan is (zoals de foutmelding en de handleiding zeggen) van het type mysqli, ofwel de "mysqli-connectie".

Dat is dus bijvoorbeeld
$myConn = mysqli_connect(........)

Dan gebruik je $myConn.

jij geeft een string (zegt de foutmelding). Ik gok de string "SELECT....."


Ok ik heb eindelijk alle foutmeldingen weggekregen maar ik blijf nu nog met 1 probleem over. Normaalgezien zou ik meerder pagina's moeten kunnen bekijken, maar wanneer ik op gelijk welk nr klik. Dan krijg ik telkens dezelfde pagina te zien. Dus met andere woorden, ik krijg niet telkens 20 nieuwe producten te zien.

Dit is de code omtrent men probleem:


<?php
$sql = "SELECT COUNT(A_ARTCODE) FROM artikel";
$rs_result = mysqli_query($dbcon, $sql) or die ("mysqli query dies");
$row = mysqli_fetch_row($rs_result) or die ("mysqli fetch row dies");
$total_records = $row[0];

$total_pages = ceil($total_records / 20);

for ($i=1; $i<=$total_pages; $i++) { 
            echo "<a href='index.php?page=".$i."'>".$i."</a> "; 
};
?>


[size=xsmall]Toevoeging op 03/06/2014 14:37:36:[/size]

Ik heb zojuist de boosdoener gevonden, ik had blijkbaar nog dit staan:

$sqlget = "SELECT *
FROM artikel, images
LIMIT 0, 20
";

heb het aangepast naar dit



$sqlget = "SELECT *
FROM artikel, images
LIMIT $start_from, 20
";

Reageren