Pflichtübung

So, jetzt bin ich fast fertig, aber ich habe noch so einige Probleme:

1. Wie kann ich prüfen ob ein Name von vorhanden ist und man was anderes eingeben muss? Wollte die Textdatei auslesen, aber das hat bei mir nicht geklappt...

2. Wie kann ich prüfen, wer welche Zahl getippt hat und dann die Gewinner auflisten?


Hier der Code für die Loseingabe:
PHP:
<?

$name = $_POST['name'];
$zahl = $_POST['zahl'];
$pattern = '/[^a-zA-Z0-9\s\']/'; 
$zpattern = '/[^0-9]/';
$tipps = file_get_contents("tipps.txt");
$personen = explode(": && @", $tipps);
$suchname = array_search($name,$personen);



if(isset($_POST['name'])){

	if(strlen($name)<3 || strlen($name)>20){$error['name']=1;}
	if(preg_match($pattern, $name) ){$error['name']=1;}	
	#if($personen !== false){$error['name']=1;}
	
	
	
	if($zahl<1 || $zahl>10){$error['zahl']=1;}
	if( preg_match($zpattern, $zahl) ){$error['zahl']=1;}

	
	
	
	$captchas = file_get_contents("captchas.txt");
	$captchas = explode("\r\n",$captchas);
	$captcha_ok=0;
	foreach($captchas as $captcha){
		$captcha = explode("|",$captcha);
		if($captcha[0]==$_POST['captcha_id'] && $captcha[1]==$_POST['captcha']){
			$captcha_ok=1;
		}
	}
	if($captcha_ok==1){
	}else{
		$error['captcha']=1;
	}
		

}



if(!isset($_POST['name']) || isset($error)){ 

?>
	



  
    

<form action="index.php?page=los" method="post">

<table>
<tr>
<td>Name:</td>
<td><input name="name" type="text" value="<? echo $_POST['name'];?>" /> <? if($error['name']==1){ echo "min 3 und max 20 Zeichen"; }?></td></tr>

<tr>
<td>Zahl:</td>
<td><input name="zahl" type="text" value="<? echo $_POST['zahl'];?>" />
<? if($error['zahl']==1){ echo "Tippe eine Zahl zwischen 1 und 10!"; }?></td></tr>

<tr><td></td>
<td>	
		<?php $captcha_id = rand(1,100000); ?> 
   		<input type="hidden" name="captcha_id" value="<?php echo $captcha_id;?>" /> 
   		<img src="captcha.php?captcha_id=<?php echo $captcha_id;?>" />
		</td></tr>

<tr>
<td>Captcha:</td>
<td><input name="captcha" type="text" /><? if($error['captcha']==1){ echo " Versuch's noch mal..."; }?></td>
</tr>

<tr>
<td></td>
<td><input value="eintragen" type="submit" /></td>

</form>

    
    
    
	
	<?
	 } else { ?>
 	<b>Vielen Dank f&uuml;r deinene Teilnahme <? echo $_POST['name'];?>!</b><br>
    <b>Dein Tipp lautet auf die Zahl <? echo $_POST['zahl'];?> wurde gespeichert.</b>
    
    <?	 
	$tipp = Array("$name:$zahl",); 
	$handle = fopen("tipps.txt","a"); 

	foreach($tipp as $line) { 
	fputs($handle,$line."\n"); 
	} 
	fclose($handle); 

    
	?>
    
<? } 

?>



und hier ist der Code, was ich bis jetzt bei der Ziehung "verbrochen" habe:
PHP:
<?php

mt_srand((double)microtime()*1000000);
$number = mt_rand(0,10);

$fname = 'tipps.txt';

function file_parse($fname)
{
    $fhandle = fopen($fname, 'r');
    $contents = fread($fhandle, filesize($fname));
    fclose($fhandle);

    $prep = str_replace("\r\n", "\n", $contents);
    $prep = str_replace("\r", "\n", $prep);

    $lines = explode("\n", $prep);

    $people = array();
    foreach($lines as $line)
    {
        $exp = explode(':', $line);
        $num = $exp[0];
        $name = $exp[1];

        if(!isset($people[$num]))
            $people[$num] = array();

        $people[$num][] = $name;
    }
    return $people;
}

$people = file_parse($fname);
$winners = $people[$number];




echo "<h3>Die Gewinner sind:</h3>\n";


		foreach($winners as $winner)
	{
		echo "<b>".$winner."</b>"."<br>\n";
	}
} 

$date = date("F j, Y - H:i:s");
$fnamewinner = 'gewinner.txt';

	if ($winner !== null) {
			$fc = "Gewinner: ".$winner."<br />\n"."Gl&uuml;ckszahl war: ".$number."<br />\n"."Ziehung am: ".$date."<br /><br />\n";
			$filehandle = fopen($fnamewinner,"a");
			fputs($filehandle,$fc."\n");
			fclose($filehandle);
	}

?>

hoff ihr könnt mir da weiterhelfen - versuch das heut schon ganzen tag hin zu bekommen :(

Hier gibts das ganze als Zip-File
 
Zuletzt bearbeitet:
die datei kannst du mit dem filereader lesen und schreiben. dabei musst du auch darauf hinweise wo die datei liegt z.B. ./test.txt

BSP aus der PHP Doku

PHP:
$filename = 'test.txt';
$somecontent = "Add this to the file\n";

// Let's make sure the file exists and is writable first.
if (is_writable($filename)) {

    // In our example we're opening $filename in append mode.
    // The file pointer is at the bottom of the file hence
    // that's where $somecontent will go when we fwrite() it.
    if (!$handle = fopen($filename, 'a')) {
         echo "Cannot open file ($filename)";
         exit;
    }

    // Write $somecontent to our opened file.
    if (fwrite($handle, $somecontent) === FALSE) {
        echo "Cannot write to file ($filename)";
        exit;
    }

    echo "Success, wrote ($somecontent) to file ($filename)";

    fclose($handle);

} else {
    echo "The file $filename is not writable";
}
?>


und hier ein beispiel wie die die daten lesen kannst:

PHP:
<?php
$handle = @fopen("/tmp/inputfile.txt", "r");
if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        echo $buffer;
    }
    fclose($handle);
}
?>

wenn due die einzelnen zeilen im csv - stil shreibst

10.10.2010;katosan;9

kannst du die mit explode() in ein array zerlegen

ein bisschen sortieren in einer schleife und du kannst mit

in_array() oder array_key_exists();

nach zahlen oder werten suchen


gruß


katosan
 
Zuletzt bearbeitet:
Ich schaff es einfach nicht mit Arrays umzugehen... :confused:

Also wenn ich das Exploden lasse, dann hab ich ja praktisch als ersten wert Teilnehmer1 als zweiten wert seine Zahl, 3.Wert=Teilnehmer2, 4.Wert=Zahl-Teilnehmer2....

Kann ich dem Array sagen, dass es zweidimensional wird und im ersten Fenster die Zahlen odrndet und dann im zweiten die dazugehörigen namen schreibt?

das mit dem in_array funktioniert auch nicht so wie ich möchte...
PHP:
$name = $_POST['name'];
$zahl = $_POST['zahl'];
$pattern = '/[^a-zA-Z0-9\s\']/'; 
$zpattern = '/[^0-9]/';
$tipps = file_get_contents("tipps.txt");
$personen = explode(":", $tipps);



if(isset($_POST['name'])){


	if(strlen($name)<3 || strlen($name)>20){$error['name']=1;}
	if(preg_match($pattern, $name) ){$error['name']=1;}	
	if(in_array($name,$personen)){$error['name']=1;}

da versuch ich zu prüfen, ob $name bereits vorhanden ist...
 
Zuletzt bearbeitet:
hi,

zu de Array's

wenn du einen Datei mit getContents () liest bekommst du natürlich alles ind zwa als


user1:12:user2:14:user3:16:.... usw.

du bist hier also von der nettigkeit deiner user abhängig, will sagen das die nicht 'user:14' oder so eintragen daher würde ich wie in meinem letzten post die user zilenweise lesen so kannst du fehlerhafte einträge aussortieren

wie auch immer auf jeden fall kannst du die user in ein Array schreiben und zwar nach der nummer können ja auch 2 oder 3 auf die 16 getippt haben.

Beispilsweise
PHP:
 foreach($lines as $line)
    {
        $exp = explode(':', $line);
        $name = $exp[0];
        $number = $exp[1];

        $result_array[$number][] = $name;

        if(!isset($people[$num]))
            $people[$num] = array();

        $people[$num][] = $name;
    }

zim anschauen von array's bietet sich übrigens folgendes an

PHP:
echo "<pre>";
print_r($result_array);
echo "</pre>";
 
OK, die übung läuft jetzt - schon mal jetzt ein großes dankeschön an euch...

hab aber nur noch 2 Kleinichkeiten die ich schaffen muss:

1) Wenn ein Name schon einmal eingetragen ist, dann soll es nicht mehr möglich sein mit den gleichen Namen mit zuspielen... Da dachte ich mich ich stell die Teilnehmer in ein array und prüfe dann mit in_array - klappt aber leider nicht :( da mach ich sicher wieder was falsch...

PHP:
<?

$name = $_POST['name'];
$zahl = $_POST['zahl'];
$pattern = '/[^a-zA-Z0-9\s\']/'; 
$zpattern = '/[^0-9]/';

$spieler = file_get_contents('tipps.txt');
$zahlen = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
$ohnezahlen = str_replace($zahlen, "", $spieler);
$teilnehmer = explode(":",$ohnezahlen);




if(isset($_POST['name'])){


	if(strlen($name)<3 || strlen($name)>20){$error['name']=1;}
	if(preg_match($pattern, $name) ){$error['name']=1;}
	$sucheperson = in_array($name,$teilnehmer);
	if($suchepersonen == true){$error['name']=1;}

	
	if($zahl<1 || $zahl>10){$error['zahl']=1;}
	if( preg_match($zpattern, $zahl) ){$error['zahl']=1;}

	
	
	
	$captchas = file_get_contents("captchas.txt");
	$captchas = explode("\r\n",$captchas);
	$captcha_ok=0;
	foreach($captchas as $captcha){
		$captcha = explode("|",$captcha);
		if($captcha[0]==$_POST['captcha_id'] && $captcha[1]==$_POST['captcha']){
			$captcha_ok=1;
		}
	}
	if($captcha_ok==1){
	}else{
		$error['captcha']=1;
	}
		

}



if(!isset($_POST['name']) || isset($error)){ 

?>
	



  
    

<form action="index.php?page=los" method="post">

<table>
<tr>
<td>Name:</td>
<td><input name="name" type="text" value="<? echo $_POST['name'];?>" /> <? if($error['name']==1){ echo "min 3 und max 20 Zeichen"; }?></td></tr>

<tr>
<td>Zahl:</td>
<td><input name="zahl" type="text" value="<? echo $_POST['zahl'];?>" />
<? if($error['zahl']==1){ echo "Tippe eine Zahl zwischen 1 und 10!"; }?></td></tr>

<tr><td></td>
<td>	
		<?php $captcha_id = rand(1,100000); ?> 
   		<input type="hidden" name="captcha_id" value="<?php echo $captcha_id;?>" /> 
   		<img src="captcha.php?captcha_id=<?php echo $captcha_id;?>" />
		</td></tr>

<tr>
<td>Captcha:</td>
<td><input name="captcha" type="text" /><? if($error['captcha']==1){ echo " Versuch's noch mal..."; }?></td>
</tr>

<tr>
<td></td>
<td><input value="eintragen" type="submit" /></td>

</form>

    
    
    
	
	<?
	 } else { ?>
 	<b>Vielen Dank f&uuml;r deinene Teilnahme <? echo $_POST['name'];?>!</b><br>
    <b>Dein Tipp lautet auf die Zahl <? echo $_POST['zahl'];?> und wurde gespeichert.</b>
    
    <?	 
	$tipp = Array("$name:$zahl",); 
	$handle = fopen("tipps.txt","a"); 

	foreach($tipp as $line) { 
	fputs($handle,$line."\n"); 
	} 
	fclose($handle); 

    
	?>
    
<? } 

?>

2) Das Captcha soll nur 60 sek gültig sein... Gibt es da einen Befehl, so wie bei Javascript das man was reloden kann, hab dazu nichts gefunden. Oder kann man eine Session anlegen, die nur 60 sekunden lang gültig ist und dann die seite neulädt?
 
Zuletzt bearbeitet:
Hmm 15. Jänner ist aber schon ein bisschen her :)

1. hab das ein bisschen neu geordnet und nu geht es auch ;)
sieht vor allem besser aus

PHP:
<?php

$name = $_POST ['name'];
$zahl = $_POST ['zahl'];
$pattern = '/[^a-zA-Z0-9\s\']/';
$zpattern = '/[^0-9]/';

/**
 * captcha landen
 */

$captchas = file_get_contents("captchas.txt");
$captchas = explode("\r\n", $captchas);
$captcha_ok = 0;
foreach ( $captchas as $captcha ) {
	
	$captcha = explode("|", $captcha);
}

/**
 * Die datei laden
 */
$filename = 'tips.txt';

// Let's make sure the file exists and is writable first.
if ( is_writable($filename) ) {
	
	// In our example we're opening $filename in append mode.
	// The file pointer is at the bottom of the file hence
	// that's where $somecontent will go when we fwrite() it.
	if ( ! $handle = fopen($filename, 'r') ) {
		
		echo "Cannot open file ($filename)";
		exit();
	}

} else {
	
	echo "The file $filename is not writable";
}

/**
 * now read the file
 */
if ( $handle ) {
	
	while ( ! feof($handle) ) {
		
		$result = explode(':', fgets($handle));
		
		if ( sizeof($result) == 2 ) {
			
			$result_array [$result [1]] [] = $result [0];
			$names [] = $result [0];
		
		}
	}
}
fclose($handle);

echo "<pre>";
print_r($result_array);
echo "</pre>";

/**
 * errorcheck
 */
if ( isset($name) ) {
	
	if ( strlen($name) < 3 || strlen($name) > 20 ) {
		
		$error ['name'] = "min 3 und max 20 Zeichen";
	}
	if ( preg_match($pattern, $name) ) {
		
		$error ['name'] = "unerlaubte Zeichen";
	}
	if ( in_array($name, $names) ) {
		
		$error ['name'] = "name existiert schon";
	}
	if ( $zahl < 1 || $zahl > 10 ) {
		
		$error ['zahl'] = "Tippe eine Zahl zwischen 1 und 10!";
	}
	if ( preg_match($zpattern, $zahl) ) {
		
		$error ['zahl'] = "Tippe eine Zahl";
	}
	if ( $captcha [0] != $_POST ['captcha_id'] && $captcha [1] != $_POST ['captcha'] ) {

		$error ['captcha'] = " Versuch's noch mal... captcha nicht io";
	}

}

/**
 * formular
 */

if ( ! isset($name) || ! empty($error) ) {
	
	$error_msg = "";
	
	foreach ( $error as $key => $value ) {
		
		$error_msg .= $key . ": " . $value . "</br>";
	
	}
	
	echo '	<form action="ziehung.php?page=los" method="post">
			<table>
				<tr>
					<td>' . $error_msg . '</td>
				</tr>
				<tr>
					<td>Name:</td>
					<td><input name="name" type="text" value="' . $_POST ['name'] . '" /></td>
				</tr>
				<tr>
					<td>Zahl:</td>
					<td><input name="zahl" type="text" value="' . $_POST ['zahl'] . '" /></td>
				</tr>
				<tr>
					<td></td>
					<td><img src="captcha.php?captcha_id=' . $captcha_id . '" /></td>
				</tr>
				<tr>
					<td>Captcha:</td>
					<td><input name="captcha" type="text" /></td>
				</tr>
				<tr>
					<td></td>
					<td><input value="eintragen" type="submit" /></td>
				</tr>
			</table>
		</form>';

} else {
	
	/**
	 * speichern
	 */
	
	echo '<b>Vielen Dank f&uuml;r deinene Teilnahme ' . $_POST ['name'] . '!</b></br>
			<b>Dein Tipp lautet auf die Zahl ' . $_POST ['zahl'] . ' und wurde gespeichert.</b>';
	
	/**
	 * write data
	 */
	$tipp = $name . ":" . $zahl . "\n";
	
	$handle = fopen($filename, "a");
	
	fputs($handle, $tipp);
	
	fclose($handle);
	
	uset($_POST);
	
	
}

?>

2 schreib doch einfach eine timestamp in die session und wenn der 60 sec her ist nimmst du einen anderen

PHP:
// session starten
session_start();

// sessions schreiben

$_SESSION['cap_ts'] = time();
 
Die namensPrüfung habe ich so weit, dass er jetzt zumindes den ersten Namen erkennt im array:

PHP:
$spieler = file_get_contents('tipps.txt');
$zahlen = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
$ohnezahlen = str_replace($zahlen, "", $spieler);
$teilnehmer = explode(":",$ohnezahlen);


//Hier erfolgt die Prüfung der Eingaben

if(isset($_POST['name'])){


	if(strlen($name)<3 || strlen($name)>20){$error['name']=1;}
	if(preg_match($pattern, $name) ){$error['name']=1;}
	if (in_array($name, $teilnehmer)) {$error['name']=1;}

Warum erkennt er den Rest nicht :confused:

Hängt das vielleicht mit dem explode zusammen, weil wenn ich mir das Array ausgeben lasse, dann sieht das so aus:

PHP:
Array
(
    [0] => Daniel
    [1] => 
mario
    [2] => 
mario
    [3] => 
mario
    [4] => 
Mario
    [5] => 
Mario
    [6] => 
Daniel
    [7] => 
Mario
    [8] => 
Mario
    [9] => 
Mario
    [10] => 
Mario
    [11] => 

)


sollte das nicht eher so aussehn:

PHP:
[0]=>Spieler1
[1]=>Spieler2
[2]=>Spieler3
[3]=>Spieler4
[4]=>Spieler5

hab ich da beim explode was falsch gemacht?
 
Hi,
in deiner tipps.txt stehen die Spieler bestimmt irgendwie so:

Spieler1: 4
Spieler2: 7
Spieler3: 8

oder?
Weil dann steht hinter dem ":" nach dem du die Zahlen entfernt hast noch ein "\r\n" also ein Zeilenumbruch und der wird dann natürlich noch mit ins Array gepackt. Darum stehen die Spieler immer eine Zeile weiter unten und das Array-Element mit dem Index 11 ist "leer" (naja ein Zeilenumbruch ist drin).

Hoffe das hilft dir weiter.

mfg.Fide
 
hmmm wie gekomm ich da am besten den Zeilenumbruch raus für das Array?

oder soll ich am besten eine txt-Datei machen, wo nur die Namen drinnen stehen?
 
Hmmm,

nimm doch einfach ein stückchen aus dem code den ich geposted habe, da sind die [newlines] schon raus

und du sparst dir das reguläre geklingel

PHP:
/**
 * Die datei laden
 */
$filename = 'tips.txt';

// Let's make sure the file exists and is writable first.
if ( is_writable($filename) ) {
    
    // In our example we're opening $filename in append mode.
    // The file pointer is at the bottom of the file hence
    // that's where $somecontent will go when we fwrite() it.
    if ( ! $handle = fopen($filename, 'r') ) {
        
        echo "Cannot open file ($filename)";
        exit();
    }

} else {
    
    echo "The file $filename is not writable";
}

/**
 * now read the file
 */
if ( $handle ) {
    
    while ( ! feof($handle) ) {
        
        $result = explode(':', fgets($handle));
        
        if ( sizeof($result) == 2 ) {
            
            $result_array [$result [1]] [] = $result [0];
            $names [] = $result [0];
        
        }
    }
}
fclose($handle);
 
Zurück