Arrays

Loban

Grünschnabel
Hallo Leute

ich kenn mich mit PhP zwar etwas aus aber bin eigentlich noch ziemlicher anfänger.
Ich will ein kleines Quiz erstellen für ne Homepage in der Fragen aus nem Fragenpool in ner Datenbank heraus gezogen werden random. Das klappt auch ganz gut. Mein Problem ist nur das eine Frage natürlich nicht doppelt gestellt werden darf.
Dies wollte ich so lösen das erstmal überprüft wird ob die Frage schon gestellt wurde (mittels eines Index in der Datenbank) und wenn nein sollte die Frage gestellt werden und am Ende der Index in ein Array eingetragen werden.
Dies klappt aber nicht so ganz und ich hoffe ihr könnt mir vielleicht helfen
Mein Code:

PHP:
<?php

session_start();

include ("SQL.inc.php");


$SQLString = "SELECT * FROM Fragen ORDER BY RAND()";
  
$Ergebnis = mysql_query($SQLString);
$Zeilen = mysql_num_rows($Ergebnis);



	$Ausgabe = mysql_fetch_object($Ergebnis);
	$Spalte1 = $Ausgabe->Index;
	$Spalte2 = $Ausgabe->Frage;
	$Spalte3 = $Ausgabe->MC;
	$Spalte4 = $Ausgabe->Antwort1;
	$Spalte5 = $Ausgabe->Antwort2;
	$Spalte6 = $Ausgabe->Antwort3;
	$Spalte7 = $Ausgabe->Antwort4;
	$Spalte8 = $Ausgabe->Antwort5;



$vorhanden = array();
prüfen();


function prüfen(){
foreach ($vorhanden as $durchgang){
if ($Spalte1 == $durchgang){
gehtnicht();
}
else{
geht();
}

}
}


function geht()
{

$SQLString = "SELECT * FROM Fragen ORDER BY RAND()";
  
$Ergebnis = mysql_query($SQLString);
$Zeilen = mysql_num_rows($Ergebnis);



	$Ausgabe = mysql_fetch_object($Ergebnis);
	$Spalte1 = $Ausgabe->Index;
	$Spalte2 = $Ausgabe->Frage;
	$Spalte3 = $Ausgabe->MC;
	$Spalte4 = $Ausgabe->Antwort1;
	$Spalte5 = $Ausgabe->Antwort2;
	$Spalte6 = $Ausgabe->Antwort3;
	$Spalte7 = $Ausgabe->Antwort4;
	$Spalte8 = $Ausgabe->Antwort5;



if ($Spalte3=="Ja"){

echo $Spalte2;

?>
<form action="Seite5.php" method="get">
<tr>
	<td>Bitte ankreuzen (Mehrere Antwortmöglichkeiten) :</td><br> 
    <td>
		<input type="checkbox" name="Frage" value="<? echo $Spalte4 ?>"> <? echo $Spalte4 ?><br>
		<input type="checkbox" name="Frage" value="<? echo $Spalte5 ?>"> <? echo $Spalte5 ?><br>
		<input type="checkbox" name="Frage" value="<? echo $Spalte6 ?>"> <? echo $Spalte6 ?><br>
		<input type="checkbox" name="Frage" value="<? echo $Spalte7 ?>"> <? echo $Spalte7 ?><br>
		<input type="checkbox" name="Frage" value="<? echo $Spalte8 ?>"> <? echo $Spalte8 ?><br>
	</td>
</tr>

<tr>					
<td>
	<input type="submit" value="Weiter">
</form>
</tr>
</td>

<?

}



if ($Spalte3=="Nein"){
echo $Spalte2;

?>

<form action="Seite5.php" method="get">
<tr>
	<td>Bitte ankreuzen (Nur eine Antwortmöglichkeit) :</td><br> 
    <td>
		<input type="radio" name="Frage" value="<? echo $Spalte4 ?>"> <? echo $Spalte4 ?><br>
		<input type="radio" name="Frage" value="<? echo $Spalte5 ?>"> <? echo $Spalte5 ?><br>
		<input type="radio" name="Frage" value="<? echo $Spalte6 ?>"> <? echo $Spalte6 ?><br>
		<input type="radio" name="Frage" value="<? echo $Spalte7 ?>"> <? echo $Spalte7 ?><br>
		<input type="radio" name="Frage" value="<? echo $Spalte8 ?>"> <? echo $Spalte8 ?><br>
	</td>
</tr>

<tr>					
<td>

	<input type="submit" value="Weiter">

</form>
</tr>
</td>

<?

}
$vorhanden = $Spalte1;

echo $vorhanden[1];
echo $Spalte1;

}

?>



<?
function gehtnicht()
{

$SQLString = "SELECT * FROM Fragen ORDER BY RAND()";
  
$Ergebnis = mysql_query($SQLString);
$Zeilen = mysql_num_rows($Ergebnis);

	$Ausgabe = mysql_fetch_object($Ergebnis);
	$Spalte1 = $Ausgabe->Index;
	
return $Spalte1;
prüfen();

}

?>

Falls Irgendwas zu meinem Problem nicht klar ist oder ich es nicht richtig beschrieben habe fragt einfach bitte.
Ich sitz nu schon seit 2h dran und komm nich dahinter was das problem ist :(
Er zeigt mir jetzt nämlich überhaupt nichts mehr an.
Nur die Fragen anzeigen geht wunderbar aber das mit dem array klappt nicht :(

Hoffe ihr könnt mir helfen
 
Warum löst du das Problem nicht effektiv über Sessions? Diese sind nicht sonderlich kompliziert in deinem Fall zu gestalten und ersparen dir Tipp- und Denkarbeit. Vom Scriptaufbau sähe das dann in etwa so aus:

PHP:
<?php
// Session starten oder fortsetzen
session_start();

// wenn Sessionvariable "asked" noch nicht gesetzt oder leer, setze String mit Char "0"
if (empty($_SESSION['asked']) || isset($_REQUEST['new'])) {
    $_SESSION['asked'] = '0';

// sql-Zeug einbinden
include ("SQL.inc.php");

// Querystring an DB senden und Rückgabe abfangen
// Sucht in allen noch nicht beantworteten Fragen
$Ergebnis = mysql_query("
      SELECT *
        FROM `Fragen`
       WHERE `Index` NOT IN ({$_SESSION['asked']})
    ORDER BY RAND()
       LIMIT 1;");

// Ergebnisanzahl
$Zeilen = mysql_num_rows($Ergebnis);

if ($Zeilen > 0):
    // erste Ergebniszeile (einzige) abfangen und in assoziatives Array verpacken
    $Ausgabe = mysql_fetch_assoc($Ergebnis);

    $Spalte1 = $Ausgabe['Index'];
    $Spalte2 = $Ausgabe['Frage'];
    $Spalte3 = $Ausgabe['MC'];
    $Spalte4 = $Ausgabe['Antwort1'];
    $Spalte5 = $Ausgabe['Antwort2'];
    $Spalte6 = $Ausgabe['Antwort3'];
    $Spalte7 = $Ausgabe['Antwort4'];
    $Spalte8 = $Ausgabe['Antwort5'];

    // Frage an Sessionvariable anhängen
    $_SESSION['asked'] .= "{$Spalte1}";

    // Ausgabe der Frage und Antworten
    echo $Spalte2;

    if ($Spalte3 == 'ja'):
        ?>
<form action="Seite5.php?<?php echo SID ?>" method="get">
<tr>
    <td>Bitte ankreuzen (Mehrere Antwortmöglichkeiten) :</td><br> 
    <td>
        <input type="checkbox" name="Frage" value="<? echo $Spalte4 ?>"> <? echo $Spalte4 ?><br>
        <input type="checkbox" name="Frage" value="<? echo $Spalte5 ?>"> <? echo $Spalte5 ?><br>
        <input type="checkbox" name="Frage" value="<? echo $Spalte6 ?>"> <? echo $Spalte6 ?><br>
        <input type="checkbox" name="Frage" value="<? echo $Spalte7 ?>"> <? echo $Spalte7 ?><br>
        <input type="checkbox" name="Frage" value="<? echo $Spalte8 ?>"> <? echo $Spalte8 ?><br>
    </td>
</tr>
<?
    else:
        ?>
<form action="Seite5.php?<?php echo SID ?>" method="get">
<tr>
    <td>Bitte ankreuzen (Nur eine Antwortmöglichkeit) :</td><br> 
    <td>
        <input type="radio" name="Frage" value="<? echo $Spalte4 ?>"> <? echo $Spalte4 ?><br>
        <input type="radio" name="Frage" value="<? echo $Spalte5 ?>"> <? echo $Spalte5 ?><br>
        <input type="radio" name="Frage" value="<? echo $Spalte6 ?>"> <? echo $Spalte6 ?><br>
        <input type="radio" name="Frage" value="<? echo $Spalte7 ?>"> <? echo $Spalte7 ?><br>
        <input type="radio" name="Frage" value="<? echo $Spalte8 ?>"> <? echo $Spalte8 ?><br>
    </td>
</tr>
<?php
    endif;
else:
    ?>
Es wurden alle Fragen beantwortet!
<?php
endif;
?>

<tr>                    
<td>
    <input type="submit" value="Weiter">
</form>
</tr>
</td>

Habe hier und da mal ein bisschen was umgebaut, damit es zB bei der Abfrage performanter ist.

Über einen POST- oder GET-Bit namens "new" kann der Fragencache der beantworteten Fragen neu erstellt werden, so dass alle Fragen wieder angezeigt werden könnten.
 
Hm ja super vielen dank!
Ich hab das jetzt aber mal ausprobiert und funktioniert noch net richtig.
Wenn ich also das so mach dann kommt der Fehler:

Parse error: parse error, unexpected $ in /homepages/2/d101550599/htdocs/Webshop/docs/Bewerbung/Seite5.php on line 85

Ich hab mir das dann mal angeschaut und entdeckt das bei:

PHP:
if (empty($_SESSION['asked']) || isset($_REQUEST['new'])) {
    $_SESSION['asked'] = '0';

keine abschliesende Klammer drin ist. Ich hab die einfach mal danach gesetzt nach dem if und dann kommen die fragen aber trotzdem doppelt bzw. immer wieder :(
Wenn ich sie ganz am Ende setz dann kommt garkeine Frage.
Woran liegt denn das?
Vielen dank auf jedenfall schonmal für die Hilfe. Wie gesagt bin da noch etwas Laie und mit Sessions hab ich mich noch nich so wirklich befasst. Da beschränkt sich mein Wissen auf session_start.

Aber trotzdem danke schonmal!
 
Ehrlich gesagt, mag ich die rein auf $_SESSION und der Session-ID basierenden Sessions auch nicht wirklich, aber zu schwer ist es nicht, wenn man es einmal verstanden hat.

Das erwähnte Problem ist ein einfacher Tippfehler meinerseits - Hab doch glatt ein Komma vergessen :rolleyes:

Also einfach
PHP:
    // Frage an Sessionvariable anhängen
    $_SESSION['asked'] .= "{$Spalte1}";
ersetzen mit
PHP:
    // Frage an Sessionvariable anhängen
    $_SESSION['asked'] .= ",{$Spalte1}";

So werden die IDs nicht zu einem Wert zusammengefügt, sondern wie gewünscht aneinander angehängt in einem kommaseperierten String.

Alternativ kannst du natürlich auch die aufgerufenen Fragen in einer weiteren Tabelle speichern und anhand der Session-ID oder was auch immer zuordnen. Die Abfrage kannst du dann ohne die $_SESSION Variable laufen lassen:

SQL:
SELECT `Fragen`.*
FROM `Fragen`
WHERE `Index` NOT IN (
    SELECT `Antworten`.`FragenIndex`
    FROM `Antworten`
    WHERE `Antworten`.`SessionID` = '$sessionid'
)
ORDER BY RAND()
LIMIT 1;

Dann müsstest du nur nach dem Anzeigen einer Frage (oder vor dem Aufruf des Frage-lese-Querys, wenn eine Frage zuvor beantwortet wurde) jedoch in eine Tabelle `Antworten` noch ein Insert absetzen, wie zB
SQL:
INSERT INTO `Antworten` (
    `FragenIndex`,
    `SessionID`,
    `Zeit`
) VALUES (
    '$frage_id',
    '$sessionid',
    NOW()
);

So kannst du das Verwenden von Sessions in dem Maße umgehen, musst aber anderweitig für eine Identifikation sorgen und ältere Datensätze irgendwann auch löschen. Von daher ist in deinem Fall die Verwendung von PHP-Sessions angebrachter und effektiver.
 
Wow es funktioniert perfekt!
Ja also wie gesagt mit Sessions bin ich noch nicht so vertraut aber ich werd mich da jetzt dann auch ma rein arbeiten :)
Vielen dank nochmal! wenn ich nochmal prob hab schreib ich einfach nochma hier rein :)
Super Forum! Danke!
 
Zurück