Ik zou graag met PHP een array willen genereren n.a.v. een SQL query result. Ik heb het halve web al afgezocht, maar ik kan de oplossing maar niet vinden. Wie wel?
Hieronder zie je in code-taal een beetje wat ik ermee bedoel:
<?php $query = array("SELECT * FROM tn_galgje"); ?>
In stappen is dit wat ik wil bereiken:
1. Een sql-query haalt een set resultaten op uit de db.
2. PHP maakt een array op van deze resultaten. Bij voorkeur houdt hij deze resultaten beschikbaar zodat deze resultset later ook als include toepassing op te vragen is.
3. Vervolgens maak ik een code op waarmee ik de resultaten op een scherm kan toveren.
Het voornaamste wat mij dus niet lukt is de vertaalslag van het in een array stoppen (in PHP) van de opgehaalde SQL resultaten.
Ik denk dat we nu heel dicht bij de ontknoping zitten. Alleen nu wil ik 'elders in mijn code' deze data niet via een echo op het scherm zetten maar via een variabele. Dit is nu mijn versie (die natuurlijk niet ZO kan werken, maar wel de bedoeling duidelijk maakt):
<?php
$data = array();
$result = mysql_query("SELECT tn_phrase FROM tn_galgje");
while ($row = mysql_fetch_array($result)){
$data[$row['id']] = $row['value'];
}
// elders in je code (in ander bestand of iets dergelijks)
foreach ($data as $id => $value){
$list = echo $id.' en '.$value;
}
?>
verder op in de code kom je de variabele $list tegen. De 'Hangman Game' van hieronder is een vereenvoudigde versie van de eerder genoemde Hangman van http://www.scriptcavern.com/freephp_hangman.php , maar nogmaals e.e.a. is slechts ter illustratie van hoe ik waardes uit een array wil kunnen oppakken om verderop in een code te kunnen gebruiken.
code van de html opbouw en vervolgens de php code:
<?php
$len_alpha = strlen($alpha);
if(isset($_GET["n"])) $n=$_GET["n"];
if(isset($_GET["letters"])) $letters=$_GET["letters"];
if(!isset($letters)) $letters="";
if(isset($PHP_SELF)) $self=$PHP_SELF;
else $self=$_SERVER["PHP_SELF"];
$links="";
$max=6; # maximum number of wrong
# error_reporting(0);
$list = strtoupper($list);
$words = explode("\n",$list);
srand ((double)microtime()*1000000);
$all_letters=$letters.$additional_letters;
$wrong = 0;
echo "<P><B>Play PHP Hangman Game</B> - Category: <B>$Category</B><BR>\n";
if (!isset($n)) { $n = rand(1,count($words)) - 1; }
$word_line="";
$word = trim($words[$n]);
$done = 1;
for ($x=0; $x < strlen($word); $x++)
{
if (strstr($all_letters, $word[$x]))
{
if ($word[$x]==" ") $word_line.=" "; else $word_line.=$word[$x];
}
else { $word_line.="_<font size=1> </font>"; $done = 0; }
}
if (!$done)
{
for ($c=0; $c<$len_alpha; $c++)
{
if (strstr($letters, $alpha[$c]))
{
if (strstr($words[$n], $alpha[$c])) {$links .= "\n<B>$alpha[$c]</B> "; }
else { $links .= "\n<FONT color=\"red\">$alpha[$c] </font>"; $wrong++; }
}
else
{ $links .= "\n<A HREF=\"$self?letters=$alpha[$c]$letters&n=$n\">$alpha[$c]</A> "; }
}
$nwrong=$wrong; if ($nwrong>6) $nwrong=6;
echo "\n<p><BR>\n<IMG SRC=\"hangman_$nwrong.gif\" ALIGN=\"MIDDLE\" BORDER=0 WIDTH=100 HEIGHT=100 ALT=\"Wrong: $wrong out of $max\">\n";
if ($wrong >= $max)
{
$n++;
if ($n>(count($words)-1)) $n=0;
echo "<BR><BR><H1><font size=5>\n$word_line</font></H1>\n";
echo "<p><BR><FONT color=\"red\"><BIG>SORRY, YOU ARE HANGED!!!</BIG></FONT><BR><BR>";
if (strstr($word, " ")) $term="phrase"; else $term="word";
echo "The $term was \"<B>$word</B>\"<BR><BR>\n";
echo "<A HREF=$self?n=$n>Play again.</A>\n\n";
}
else
{
echo " # Wrong Guesses Left: <B>".($max-$wrong)."</B><BR>\n";
echo "<H1><font size=5>\n$word_line</font></H1>\n";
echo "<P><BR>Choose a letter:<BR><BR>\n";
echo "$links\n";
}
}
else
{
$n++; # get next word
if ($n>(count($words)-1)) $n=0;
echo "<BR><BR><H1><font size=5>\n$word_line</font></H1>\n";
echo "<P><BR><BR><B>Congratulations!!! You win!!!</B><BR><BR><BR>\n";
echo "<A HREF=$self?n=$n>Play again</A>\n\n";
}
?>
... afsluitende html code om de pagina opmaak af te sluiten volgde hier, maar ik hoopte de boel een beetje in te korten en toch de intentie van die Hangman pagina duidelijk te maken. Je kunt gevoegelig door de evaluatie van die code heen lezen hoe de pagina wordt opgebouwd. Het stuk waar ik steeds op struikel wordt behandeld in het stuk: $word_line="";
$word = trim($words[$n]); . Daar moeten de galgje woorden uit mijn SQL database getoond worden. Maar daarvoor in de plaats zag ik in mijn laatste versie het woord 'ARRAY' als galgje woord. Ook leuk, maar dat was niet de bedoeling.
Tot dusver heb ik de uitleg van de mensen die mij hier proberen te helpen steeds begrepen. Die stukken code die jullie hebben gebruikt zijn mij ook niet 100% nieuw. Het gaat nu om het feitelijke stuk van de vraag: hoe til ik die waarden uit die array en vul ik die in $list ?
Klopt, die fout heb ik er bewust ingezet om mijn bedoeling duidelijk te maken (zie eerder in mijn post hierboven). In elk geval is de toelichting op string versus array duidelijk. Er begint zich een plaatje in mijn hoofd te ontstaan wat mij duidelijk maakt waarom het zus wel kan en zo niet.
De random-query leek in de eerste instantie een gouden greep. In combinatie met de code die je eronder getikt had leek het de uitkomst te bieden. Ik krijg nu keurig een random woord uit de database in de browser voorgesteld die ik moet raden. Maar bij elk galgje letter wat ik in geef gaat er toch nog iets mis.
Mijn vermoeden is dat de parser steeds opnieuw de code doorloopt en zodoende via de RAND() steeds een nieuw woord uit de database pakt.
Stap voor stap gebeurd er dit (stel dat we de drie woorden APPEL, PEER en BANAAN in de db hebben staan):
1: in het scherm verschijnt "_ _ _ _ _ "
2: ik kies B
2: in het scherm verschijnt "_ _ _ _ "
3: ik kies E
4: in het scherm verschijnt "_ _ _ E _ "
5: ik kies A
6: in het scherm verschijnt "B A _ A A _"
7: ik kies P
8: in het scherm verschijnt "P E E _"
9: ik kies N (want ik denk dat het goede antwoord PEEN is)
10: in het scherm verschijnt "B A N A A N" !!!
Haha! De parser genereert terwijl ik letters kies gewoon steeds een ander woord. Ik moet toegeven dat het wel een origineel Galgje is geworden zo. Maar wel super irritant en niet de bedoeling.
Ik ben bezig te kijken hoe ik het zelf kan oplossen. Maar wellicht dat iemand met me mee wilt denken? Vast bedankt!
De volgende informatie is ter illustratie hoe de orginele code was versus hoe ik deze wilde verbouwen tot eentje die aan een SQL db is gekoppeld:
<?php
$Category = "Web Programming";
# list of words (phrases) to guess below, separated by new line
$list = "JAVA BEANS
PHP SCRIPTS
SOURCE CODE
JAVASCRIPT GAMES
SSI IS SERVER SIDE INCLUDES
BILL GATES
COOKIES
HTTP AUTHENTICATION
ERROR HANDLING
MANIPULATING IMAGES
FILE UPLOADS
DATABASE CONNECTION
APACHE SERVER
ZIP FILE
TAR COMPRESSION
FUNCTIONS
ENCRYPTION
MYSQL DATABASE
INITIALIZATION
FAQ - FREQUENTLY ASKED QUESTIONS
DEBUGGING
VERIFICATION
HTML VALIDATION
CASCADING STYLE SHEETS";
?>
Dit stuk van de code heb ik nu vervangen in:
<?php
$Category = "Web Programming";
# list of words (phrases) to guess below, separated by new line
$result = mysql_query("
SELECT tn_phrase
FROM tn_galgje
ORDER BY RAND()
LIMIT 1");
$row = mysql_fetch_array($result);
$list = $row['tn_phrase'];
?>
Mijn eigen bijgewerkte versie (maar natuurlijk m.b.v. jullie input) levert nu het bijdehandte Galgje op zoals in mijn vorige reactie in deze post.
Ik heb al geprobeerd de query in te sluiten als include, maar dat levert hetzelfde resultaat op. Wat ik nu probeer te verzinnen is een antwoord op deze regel:
<?php
# list of words (phrases) to guess below, separated by new line
?>
Die new line lijkt wel de nekkenbreker!
Niet Bumpen:
Twee of meer keer achter elkaar in een topic posten heet bumpen. Bumpen is pas na 24 uur toegestaan en kan een reden zijn voor de admins en moderators om een topic te sluiten. Gebruik indien nodig de knop om je tekst aan te passen.
Dat houdt dan toch in dat je maar één antwoord hebt en dat kan je niet in een string doen die 'separated by new line' is want er is geen tweede regel. Ik weet niet of dat verder uitmaakt.
Ik vrees dat ik je niet helemaal kan volgen. Of eigenlijk spreken de feiten elkaar dan tegen. Met de LIMIT 1 verwacht ik als result uit de query maar 1 resultaat. Een nieuwe regel bestaat dus inderdaad niet, want het aantal resultaten worden ingeperkt tot 1.
Waarom komt het script dat toch steeds met een nieuw woord als resultaat wanneer je letters aan het raden bent? Voor het gemak hierbij een link naar mijn site waar ik het script heb geupload in huidige staat van functionaliteit:
Het is zeer logisch dat je constant een nieuw woord krijgt, want zodra jij een letter kiest (bijv de K), dan wordt de pagina ververst en wordt de query opnieuw gedraaid, met als uitkomst een ander woord.
Zeer logisch dus.
Je hebt 2 opties.
1. Javascript
Of je zorgt ervoor dat de pagina 1 maal geladen wordt en maakt het raden van de letters in javascript. Hierdoor wordt de pagina niet meer ververst. Nadeel van deze optie is dat een slimme bezoeker al ergens in de bron het woord kan lezen (tenzij je gebruik maakt van AJAX :P). Grote voordeel is dat je het spel interactief maakt (gebruiker kiest -> directe feedback)
2. PHP sessions
Of (ik denk meer jouw voorkeur) je maakt gebruik van sessies. Na de eerste keer laden van de pagina wordt het woord in een sessie gezet, waardoor het woord wordt onthouden (ook na verversen van de pagina).
<?php
$Category = "Web Programming";
if (!isset($_SESSION['woord'])){
# list of words (phrases) to guess below, separated by new line
$result = mysql_query("
SELECT tn_phrase
FROM tn_galgje
ORDER BY RAND()
LIMIT 1");