php-database weergave

Plaats reactie
Ben
Starter Plus
Starter Plus
Berichten: 29
Lid geworden op: 28 maa 2007, 12:12

Gegroet,

ik wil een MySQL-database weergeven met php, maar struikel over één probleempje:

het gaat om een databank met titelgegevens van boeken. De velden die er in het voorbeeld toe doen zijn 'auteur' en 'titel'. Die beide weergeven is niet echt het probleem. De weergave is dan als volgt:

"Auteur, titel"

Het probleem treedt op als er geen auteur is ingegeven in het auteursveld. Dan wordt die weergave natuurlijk:

", Titel"

Ik zou nu willen dat die komma verdwijnt als er geen auteur is ingegeven. Het scriptje dat ik daarvoor had gemaakt, is het volgende (het werkt dus wel niet, en ik zou willen dat het wel werkt! :)):

(alle html-opmaak heb ik eruitgezwierd)

Code: Selecteer alles

<?php
$username="user";
$password="paswoord";
$database="db";

mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$query="SELECT * FROM db ORDER BY auteur";
$result=mysql_query($query);

$num=mysql_numrows($result);

mysql_close();

$i=0;
while ($i < $num) {

$titel=mysql_result($result,$i,"titel");
$auteur=mysql_result($result,$i,"auteur");


En hier komt het kritieke stukje:

Code: Selecteer alles

 if ($auteur=NULL) {
                   echo $titel;
      }
          else {
   echo $auteur.", ".$titel;
   }


Wat er door het bovenstaande stukje code gebeurt, is dat in alle referenties enkel de titel verschijnt. Ik vermoed dus dat door het feit dat hij ergens in de databank een NULL-waarde terugvindt bij auteur, toch alle titels worden aangetast. Hoe kan ik dit oplossen?

Code: Selecteer alles

$i++;
}
?>
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16609
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 564 keer
Bedankt: 759 keer
Contacteer:

= NULL kan je niet gebruiken volgens mij, want de return is namelijk niet niks, maar leeg, en dat controleer je met == "" of empty().

Dus in jouw voorbeeld zou dat worden:

Code: Selecteer alles

if (empty($auteur)) { 
                   echo $titel;
      }
          else {
   echo $auteur.", ".$titel;
   }
Beostar
Member
Member
Berichten: 73
Lid geworden op: 29 mei 2007, 09:48

lang geleden dat ik nog php heb gedaan ;) maar if ($auteur = NULL) is volgens mij toch een toekenning ? een condition is toch met dubbele = (==)
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16609
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 564 keer
Bedankt: 759 keer
Contacteer:

Los van het feit dat uw code er redelijk ingewikkeld uit ziet voor iets simpels.

Dit doet hetzelfde als jouw code, maar is 'leesbaarder'/'gangbaarder':

Code: Selecteer alles

<?php 
// dit zou ik wel in een include zetten, moet je dat niet telkens opnieuw vermelden. --->
$username="user";
$password="paswoord";
$database="db";

mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
// <--- tot hier
$query="SELECT * FROM db ORDER BY auteur";
$result=mysql_query($query);
$num=mysql_numrows($result);

while ($row = mysql_fetch_array($result)) {
  if (empty($row['auteur'])) {
    echo $row['titel'];
  } else {
    echo $row['auteur'].", ".$row['titel'];
  }
}
?>
Die close van de connectie is netjes, maar hoeft in principe niet aangezien die gesloten wordt als het script gedaan heeft. Da's wél nodig als je persistent connections gebruikt (die open blijven staan). Dat doe je via mysql_pconnect().

En beostar, verdikke, ja, overheengekeken :-)
Dat is het waarschijnlijk!
Laatst gewijzigd door meon 26 jul 2007, 15:15, in totaal 1 gewijzigd.
Ben
Starter Plus
Starter Plus
Berichten: 29
Lid geworden op: 28 maa 2007, 12:12

meon schreef:= NULL kan je niet gebruiken volgens mij, want de return is namelijk niet niks, maar leeg, en dat controleer je met == "" of empty().

Dus in jouw voorbeeld zou dat worden:

Code: Selecteer alles

if (empty($auteur)) { 
                   echo $titel;
      }
          else {
   echo $auteur.", ".$titel;
   }



Idd, werkt nu wel! Bedankt!

Mja, ik ben nog niet zo lang bezig met php, en vind het al niet slecht van mezelf dat ik dit al klaargespeeld kreeg :)
Ben
Starter Plus
Starter Plus
Berichten: 29
Lid geworden op: 28 maa 2007, 12:12

Mmm, heb toch nog een bijkomende vraag:

zou ik die titel nu nog in italics kunnen weergeven, terwijl de auteur gewoon gedrukt blijft? Ik wilde dit met html te regelen door mijn scriptje ff te onderbreken, maar dan werkt het scriptje niet meer...
YuGuY
Starter
Starter
Berichten: 10
Lid geworden op: 26 jul 2007, 15:13
Locatie: Bilzen
Contacteer:

Code: Selecteer alles

if (empty($auteur)) { 
                   echo $titel;
      }
          else {
   echo "$auteur.", <i>".$titel."</i>";
   }
Ben
Starter Plus
Starter Plus
Berichten: 29
Lid geworden op: 28 maa 2007, 12:12

Inderdaad, ik had het net zelf uitgevist, excuses voor het ongemak, en toch hartelijk bedankt voor de reactie!

edit:

het is te zeggen, ik had het als volgt opgelost:

Code: Selecteer alles

<?  if (empty($auteur)) 
   {
   echo $titel;
   }
               else {
   echo $auteur.", "?> <em> <? echo $titel;
   }
    ?></em>
Laatst gewijzigd door Ben 26 jul 2007, 15:29, in totaal 1 gewijzigd.
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16609
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 564 keer
Bedankt: 759 keer
Contacteer:

Tuurlijk.

Code: Selecteer alles

if (empty($auteur)) { 
                   echo "<em>".$titel."</em>";
      }
          else {
   echo $auteur.", <em>".$titel."</em>";
   }

En als je het via een style wilt doen:

Code: Selecteer alles

if (empty($auteur)) { 
                   echo "<span style=\"font-style: italic;\">".$titel."</span>";
      }
          else {
   echo $auteur.", <span style=\"font-style: italic;\">".$titel."</span>";
   }

Als er in uw te echo-en code een " voorkomt, niet vergeten te escapen met een backslash!
//edit: wat zijn ze hier rap! :)
Ben
Starter Plus
Starter Plus
Berichten: 29
Lid geworden op: 28 maa 2007, 12:12

meon schreef://edit: wat zijn ze hier rap! :)


Nogal ja, want je was mijn edit van twee posts hierboven dus ook voor :)
Poedelbrein
Plus Member
Plus Member
Berichten: 109
Lid geworden op: 22 feb 2007, 18:46

Ben schreef:Inderdaad, ik had het net zelf uitgevist, excuses voor het ongemak, en toch hartelijk bedankt voor de reactie!

edit:

het is te zeggen, ik had het als volgt opgelost:

Code: Selecteer alles

<?  if (empty($auteur)) 
   {
   echo $titel;
   }
               else {
   echo $auteur.", "?> <em> <? echo $titel;
   }
    ?></em>

Misschien toch even de basis van PHP opnieuw doornemen, samen met het basis concept achter de taal. Staan teveel fouten in om ook maar te beginnen met verbeteren :?
Ben
Starter Plus
Starter Plus
Berichten: 29
Lid geworden op: 28 maa 2007, 12:12

Poedelbrein schreef:Misschien toch even de basis van PHP opnieuw doornemen, samen met het basis concept achter de taal. Staan teveel fouten in om ook maar te beginnen met verbeteren :?


Ik pretendeer ook helemaaaaal niet dat ik veel ken van php, maar het werkt wel, en dat is momenteel toch even het belangrijkst.

Het is trouwens zowat het enige wat ik moet doen met die php, dus het niet zo dat ik me daar zwaar ga in verdiepen, alleen om zoiets als dit geflikt te krijgen...
crapiecorn
Elite Poster
Elite Poster
Berichten: 2149
Lid geworden op: 01 feb 2003, 11:58
Uitgedeelde bedankjes: 44 keer
Bedankt: 12 keer

Er is ook nog zo iets als PDO, kan je je code nog wat mee verkleinen en compatibel maken met elke db die ondersteund wordt door PDO.
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16609
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 564 keer
Bedankt: 759 keer
Contacteer:

crapiecorn schreef:Er is ook nog zo iets als PDO, kan je je code nog wat mee verkleinen en compatibel maken met elke db die ondersteund wordt door PDO.

Da's ellendig, pdo :)
Ik heb het geprobeerd te gebruiken hier, maar 't bolde langs geen kanten, net zo min als de mssql-functies overigens. odbc deed het wél (want ingebakken in de php-binary), dus is het dat geworden ...
Poedelbrein
Plus Member
Plus Member
Berichten: 109
Lid geworden op: 22 feb 2007, 18:46

Ben schreef:Ik pretendeer ook helemaaaaal niet dat ik veel ken van php, maar het werkt wel, en dat is momenteel toch even het belangrijkst.

Het is trouwens zowat het enige wat ik moet doen met die php, dus het niet zo dat ik me daar zwaar ga in verdiepen, alleen om zoiets als dit geflikt te krijgen...


Code: Selecteer alles

<?  if (empty($auteur))
   {
   echo $titel;
   }
               else {
   echo $auteur.", "?> <em> <? echo $titel;
   }
    ?></em>

Die code gaat lang geen kanten werken. De open- en sluit tags voor PHP niet correct, er mankeert een ; bij een lijn en het zondigt tegen de reden waar PHP voor bestaat (dynamisch HTML genereren). Om nog maar te zwijgen van dat <em> geen italic is :lol:
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16609
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 564 keer
Bedankt: 759 keer
Contacteer:

Poedelbrein schreef:Die code gaat lang geen kanten werken. De open- en sluit tags voor PHP niet correct, er mankeert een ; bij een lijn en het zondigt tegen de reden waar PHP voor bestaat (dynamisch HTML genereren). Om nog maar te zwijgen van dat <em> geen italic is :lol:
Die code is wél syntactisch correct. Als je PHP afsluit met ?> geef je eigenlijk ook een ; mee. daarom dat je dit kan doen: <?= $var ?>. En <em> is wél italic volgens de ingebouwde stylesheets van quasi alle browsers. <i> is nog de entiteit uit HTML 4.0. Semantisch gezien probeer je iets te benadrukken als je iets cursief zet (vandaar de <em>phesize). Dat een screenreader dit dus overruled bvb is alleen maar omdat het op die manier accessible is.
Poedelbrein
Plus Member
Plus Member
Berichten: 109
Lid geworden op: 22 feb 2007, 18:46

Ah, kijk eens aan. Dacht altijd dat <em> bold zette, omdat dat emphasizing was. Dat van de ?> een ; toevoegen, tot daaraan toe. Lijkt me ietwat raar, maar zou wel kunnen. De <? zonder vermelding van PHP is veronderstel'k dus omdat het in een .php file zit. Nog niet zelf geprobeerd, dus is't puur speculatie (mmmm... speculaas). Zelfs als het zo toch zou werken, blijft het wel 'bad practice', zoals ze zeggen.
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16609
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 564 keer
Bedankt: 759 keer
Contacteer:

<?= is shorthand voor <?php echo
En bold is semantisch gezien <strong>.
<? zonder <?php is als de directive short_open_tag in php.ini aan staat. Bij PHP 5.2 is dat denk ik niet standaard aan.
Maar waarom zou dit bad practice zijn?
Als je het iets netter formatteert lijkt het al minder erg:

Code: Selecteer alles

<?  
if (empty($auteur)) {
  echo $titel;
} else {
  echo $auteur.", "?>
  <em><? echo $titel;  } ?>
</em>
Wat ik hier wel zie is dat de </em> buiten de if-constructie valt en ge dus ne orphan element hebt indien $auteur leeg is. In dat geval zou die pagina niet xhtml valid zijn.
BungaMan
Elite Poster
Elite Poster
Berichten: 1485
Lid geworden op: 16 nov 2005, 09:05

Code: Selecteer alles

<?
if (!empty($auteur))
{
    echo $auteur . ", ";
}
echo "<em>" . $titel . "</em>";
?>

en je hebt een deftig stukje leesbare code.
Please help, looking for a way to get rich and fast
crapiecorn
Elite Poster
Elite Poster
Berichten: 2149
Lid geworden op: 01 feb 2003, 11:58
Uitgedeelde bedankjes: 44 keer
Bedankt: 12 keer

BungaMan schreef:

Code: Selecteer alles

<?
if (!empty($auteur))
{
    echo $auteur . ", ";
}
echo "<em>" . $titel . "</em>";
?>

en je hebt een deftig stukje leesbare code.

Klopt, als je iets hebt wat altijd weergegeven wordt kan je dit beter buiten de selectie zetten.
Fr3aK
Member
Member
Berichten: 72
Lid geworden op: 03 nov 2003, 19:09
Locatie: Rumst

meon schreef:

Code: Selecteer alles

<?php 
// dit zou ik wel in een include zetten, moet je dat niet telkens opnieuw vermelden. --->
$username="user";
$password="paswoord";
$database="db";

mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
// <--- tot hier
$query="SELECT * FROM db ORDER BY auteur";
$result=mysql_query($query);
$num=mysql_numrows($result);

while ($row = mysql_fetch_array($result)) {
  if (empty($row['auteur'])) {
    echo $row['titel'];
  } else {
    echo $row['auteur'].", ".$row['titel'];
  }
}
?>

In dit geval zou ik mysql_fetch_assoc() gebruiken ipv mysql_fetch_array() aangezien die laatste de gegevens zowel met een numerieke als associatieve index opslaat en dus veel groter wordt.

't Is maar een suggestie ;)
misterjo
Premium Member
Premium Member
Berichten: 670
Lid geworden op: 30 nov 2003, 13:23
Locatie: leuven
Uitgedeelde bedankjes: 22 keer
Bedankt: 16 keer

man man stop nu eens met die html opmaaknest. Maak er van in het begin een gewoonte van om CSS als opmaak te gebruiken en XHTML voor de inhoud en PHP voor de scripting (backend) en eventueel nen hoop javascript of ajax voor de gebruiksvriendelijkheid...
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16609
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 564 keer
Bedankt: 759 keer
Contacteer:

Oei, nu maakt ge wel een dikke fout eh.
AJAX en javascript is bijlange niet 'gebruiksvriendelijk' als ge het gebruikt om te gebruiken. En opmaaknest? <em> en <strong> zijn net accessible elementen, in tegenstelling tot <i> en <b>. Ge gaat namelijk semantisch om met uw opmaak (ge zegt niet: ik wil dit vet, maar ik wil dit benadrukken).
En wie zegt dat er hier geen CSS bij komt te zien? Voor het zelfde geld hebt ge ergens

Code: Selecteer alles

body #main div.leftcolumn strong:hover {
  color: #fff;
  font-weight: bold;
}
staan...
Ik wil maar zeggen: op basis van die éne regel html-output kunt ge compleet niet beoordelen of het resultaat dan wel CSS, XHTML en javascript gebruikt en is uw opmerking dus enkel geplaatst om discussie uit te lokken (wat bij deze dus gelukt is :?)
misterjo
Premium Member
Premium Member
Berichten: 670
Lid geworden op: 30 nov 2003, 13:23
Locatie: leuven
Uitgedeelde bedankjes: 22 keer
Bedankt: 16 keer

Ajax is inderdaad niet makkelijk te gebruiken maar je kan er wel je interface naar de gebruiker mee verbeteren. Van dat em weet ik ook wel , ik had het over de opmaaktags als <i> , ....

Wat betreft dat er geen css file is , was gewoon een veronderstelling aangezien hij met opmaakcodes zijn auteur tekst wou aanpassen.
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16609
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 564 keer
Bedankt: 759 keer
Contacteer:

misterjo schreef:Ajax is inderdaad niet makkelijk te gebruiken maar je kan er wel je interface naar de gebruiker mee verbeteren.
Kàn, maar is zelden het geval. "Ooh ja, laten we heel onze interface ajaxifyen" en dan tot de conclusie komen dat de back/forward-buttons niet meer werken en de mensen geïrriteerd raken van uw site. Da's gelijk bvb de Belgacom-site: om de een of andere reden wordt de inhoud van de pagina achteraf via ajax toegevoegd? Ik heb een geëxperimenteerd met dat soort pagina: de ajax-versies waren zwaarder, trager, veel lastiger te implementeren en het resultaat was net het zelfde als alles in 1x meesturen. Tja, dan weet ik wel wat kiezen.
misterjo
Premium Member
Premium Member
Berichten: 670
Lid geworden op: 30 nov 2003, 13:23
Locatie: leuven
Uitgedeelde bedankjes: 22 keer
Bedankt: 16 keer

Het staat nog niet op punt maar naar gelang welke toolkit je gebruikt kan je er toch voordelen aan hebben... (dat het minder groot wordt is in de meetste gevallen niet waar)
BungaMan
Elite Poster
Elite Poster
Berichten: 1485
Lid geworden op: 16 nov 2005, 09:05

mijn gedacht moet er niks op punt gesteld worden. alleen de webbouwer die het wat deftiger moet aanpakken. Gebruiken wanneer het nodig is en niet omdat het in hype mode zit.
Please help, looking for a way to get rich and fast
Gebruikersavatar
meon
Administrator
Administrator
Berichten: 16609
Lid geworden op: 18 feb 2003, 22:02
Twitter: meon
Locatie: Bree
Uitgedeelde bedankjes: 564 keer
Bedankt: 759 keer
Contacteer:

Laat staan dat de moeite die er in gestoken zou worden het doel heiligt. En dan heb ik het, gezien de kennis, het aanleren, proberen, nog eens proberen, nog eens proberen, ...
Plaats reactie

Terug naar “Development”