|
bituniverse.com Entwickler Forum
|
| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
Simon W. Anti-verdenglischungs-Abgeordneter
Anmeldedatum: 05.11.2007 Beiträge: 283 Wohnort: Aachen
|
Verfasst am: Do 19 Feb, 2009 14:18 Titel: |
|
|
Die Zeile
> $dbtag = $row ['tag'];
schreibt den Tag eines eintrags in die Variable $dbtag... als String, Int, oder was auch immer. Nur nicht als Array.
Sprich: der Zugriff mit einem Array-Index
> if ($dbtag ['tag'] == $tag
kann nicht funktionieren.
Außerdem holst du dir in der Schleife einen Eintrag nach dem anderen ab und überschreibst jeweils die vorherigen Inhalte von $dbtag (& $dbuhrzeit). Du musst schon innerhalb der Schleife diese Werte abfragen und dir dann merken (z.B. in einer Variable), ob eine Kollision vorlag oder nicht.
|
|
| Nach oben |
|
 |
Beepa
Anmeldedatum: 05.11.2007 Beiträge: 53 Wohnort: Düsseldorf
|
Verfasst am: Do 19 Feb, 2009 14:47 Titel: |
|
|
Hi Christoph,
mal ein paar kleine Anmerkungen von meiner Seite dazu:
1.) Du hast ja den Tag & die Uhrzeit, an denen der Termin gebucht werden soll über das Form
erhalten und kannst damit die SQL-Abfrage der vorhandenen Termine eingrenzen um das ganze
so performant wie möglich zu gestalten. Daher schlage ich ein Statement im Sinne von folgendem
vor:
SELEKTIERE tag, uhrzeit, nickname AUS tabelle WO tag=tag_laut_formular AND uhrzeit=zeit_laut_form;
Da muss man dann natürlich dran denken, dass in der DB i.d.R. das Datumsformat
YYYY-MM-DD ist und der User ggf. das Format DD.MM.YYYY oder DD.MM.YY eingegeben
hat, aber das kann man ja abfangen (siehe auch z.B. MySQL-Funkt. DATE_FORMAT)
Durch dieses Statement hast du zwei Fliegen mit einer Klappe geschlagen - wenn
ein Datensatz gefunden wird, hast auch gleich den Namen des "Buchenden" zur Hand und
wenn kein DS gefunden wurde, weißt du, dass der Termin noch frei ist. Das geht in
diesem Fall aber auch nur "so einfach", weil du feste Werte für die Zeiten hast und
damit keine Überschneidungen zeitlich gesehen auftreten können.
Dazu mal die Funktion mysql_affected_rows() ansehen - die kann dir da weiterhelfen
Als Pseudo-Code-Beispiel
| Code: |
Query absetzen
Wenn(Anzahl Datensätze == 0)
Termin eintragen
Sonst
Datensatz aus Resultset auslesen (mysql_fetch_array())
Ausgabe: Der Termin wurde schon von . NAME_LAUT_DB . belegt
|
2.) deine aktuelle While-Schleife
| Zitat: |
while ($row = mysql_fetch_assoc ($result) )
{
$dbtag = $row ['tag'];
$dbuhrzeit = $row ['uhrzeit'];
}
|
kann so nicht funktionieren, weil du das Resultset aus der Abfrage zwar durchläufst,
aber - da du kein Array zur Speicherung verwendest - dir immer nur die letzte Uhrzeit
und das letzte Datum zur Verfügung stehen, da die Variablen bei jedem Durchlauf
überschrieben werden. So gesehen also: entweder kurze While() und Werte in ein Array
ODER die While() um den kompletten(!) Ablauf der Prüfung packen...
| Php: |
<?php
// Beispiel while() mit Array
// Haupt-Array deklarieren
// While-Schleife
{
// temp.Unterarray deklarieren - wird in jedem
// Durchlauf überschrieben
$tmp['tag'] = $row['tag'];
$tmp['uhrzeit'] = $row ['uhrzeit'];
// temp.Array ins Hauptarray übernehmen
$data_array[] = $tmp;
}
// Debug-Ausgabe des Hauptarrays um den Aufbau zu zeigen
?>
|
Gehen wir davon aus, dass du mit dem Array-Beispiel eine Prüfung durchführen möchtest:
| Php: |
<?php
$exists = false;
foreach($data_array as $index => $data)
{
if($data['tag'] == $_POST['tag'] && $data['uhrzeit'] == $_POST['uhrzeit'])
$exists = true;
}
if($exists === true)
{
// Termin eintragen
}
else
{
// Termin belegt
}
?>
|
Ich würde in deinem Falle dann lieber die While() um das ganze Konstrukt legen
und dann ggf. die Verarbeitung abbrechen, weil dann die Unterprüfungen wegfallen und
das "in einem Rutsch" gemacht werden kann...
Ich hoffe, dass hilft dir etwas weiter 
Gruß
|
|
| Nach oben |
|
 |
Beepa
Anmeldedatum: 05.11.2007 Beiträge: 53 Wohnort: Düsseldorf
|
Verfasst am: Do 19 Feb, 2009 14:59 Titel: |
|
|
Mir fällt gerade ein, dass es noch einfacher gehen würde, aber ich will deine Vorkenntnisse nicht strapzieren
Nur der Vollständigkeit wegen:
Wenn du in der Tabelle die Spalten tag und uhrzeit als Unique deklarierst,
und mit INSERT IGNORE INTO .... einfach direkt das Einfügen versuchst,
kannst du prüfen ob Anzahl betroffener DS == 1 (dann war es erfolgreich)
oder Anzahl betroffener DS == 0 (dann hat es nicht geklappt)...
Wobei man dieser Variante eventuell unterstellen könnte, dass sie etwas unsauber ist...
Gruß
|
|
| Nach oben |
|
 |
Gast
|
Verfasst am: So 08 März, 2009 04:49 Titel: |
|
|
@beepa, simon und m,
vielen lieben Dank für Eure Hilfestellung - Leider komme ich erst heute dazu, zu antworten - Karneval in Kölle, viel Arbeit usw. hielten mich auf.
Ich werde mir Eure Tipps jetzt in Ruhe anschauen und ggf. Slava zu Rate ziehen, er sitzt 2 Büros neben mir *gg* - Nein, Spass beiseite, ich werde mich versuchen und ggf. weiter fragen, wenn ich nicht weiter komme.
Nochmals lieben Dank an Euch,
Christoph
|
|
| Nach oben |
|
 |
Christoph
Anmeldedatum: 17.02.2009 Beiträge: 38 Wohnort: Köln
|
Verfasst am: Fr 20 März, 2009 18:12 Titel: |
|
|
Soderle,
erstmal einen schönen guten Abend zusammen 
Ich habe mein Sceipt jetzt angepasst, aber irgentwo steckt noch der Wurm drin, in so fern, als das keine Daten im Array bzw. den Vars gespeichert, und somit auch nicht an die DB übergeben werden.
Habe mal versucht, mir den Inhalt der Var. $tag per echo ausgeben zu lassen, aber die Var. scheint leer zu bleiben.
Hier mal der PHP-Teil meiner send.php:
| Code: |
<?php
include ("config/db_config.php");
$select = "SELECT tag, uhrzeit FROM $table WHERE tag = '".$tag."' AND uhrzeit = '".$uhrzeit."' ";
$result = mysql_query($select);
$data_array = array();
while($row = mysql_fetch_assoc($result))
{
$tmp = array();
$tmp['tag'] = $row['tag'];
$tmp['uhrzeit'] = $row ['uhrzeit'];
$data_array[] = $tmp;
}
$exists = false;
foreach($data_array as $index => $data)
{
if($data['tag'] == $_POST['tag'] && $data['uhrzeit'] == $_POST['uhrzeit'])
$exists = true;
}
if($exists === true)
{
$nickname = $_POST ['nickname'];
$tag = $_POST ['tag'];
$uhrzeit = $_POST ['uhrzeit'];
$sendungsname = $_POST ['sendungsname'];
$eintrag = "INSERT INTO $table (nickname, tag, uhrzeit, sendungsname)
VALUES ('$nickname', '$tag', '$uhrzeit', '$sendungsname' )";
mysql_query ($eintrag);
#mysql_close ();
echo "Dein Eintrag wurde erfolgreich gespeichert";
}
else
{
echo "Dieser Sendeplatz ist bereits belegt";
}
echo $tag;
?>
|
Vllt. habt Ihr eine Idee, was ich da "versemmelt" habe.
Vorab vielen Dank und Greetz aus Köln
Christoph
_________________
Computerstörungen sitzen immer ca. 50 cm. vor dem Bildschirm 
|
|
| Nach oben |
|
 |
M
Anmeldedatum: 05.11.2007 Beiträge: 107 Wohnort: Aachen
|
Verfasst am: Fr 20 März, 2009 20:14 Titel: |
|
|
Wo kommt $tag denn überhaupt her? Das ist aus deinem Code hier nicht ersichtlich.
Aber mal allgemeiner:
Wenn ich das, was du vorhast so richtig verstanden habe, dann kannst du dir die ganze Geschichte mit dem SELECT und dem if($exists) sparen. Du nimmst die gewünschten Werte vom User entgegen, machst ein SELECT mit diesen und überprüfst hinterher ob du mehr als 0 Zeilen bekommst. Das heißt ja dann, das der Termin schon belegt ist. de2.php.net
Deine jetzige Abfrage macht ja genau das Gegenteil, sie läst nur Einträge durch, die schon belegt sind 
Zum debugen eignen sich ganz gut var_dump() und print_r().
Wobei print_r schnell unübersichtlich wird, wenn du es dir im Browser ausgeben läst, dann einfach ein echo '<pre>'; davor und ein echo '</pre>'; dahinter.
Vergewissere dich auch, das error_reporting auf E_ALL steht und display_errors eingeschaltet ist.
|
|
| Nach oben |
|
 |
Christoph
Anmeldedatum: 17.02.2009 Beiträge: 38 Wohnort: Köln
|
Verfasst am: Fr 20 März, 2009 23:38 Titel: |
|
|
Hi @M
erstmal Danke für Deine Antwort 
| M hat Folgendes geschrieben: |
| Wo kommt $tag denn überhaupt her? Das ist aus deinem Code hier nicht ersichtlich. |
Also die Var. $tag befülle ich doch mit
aus dem Formular?? - Ergo müsste mir der Inhalt doch mit echo $tag; ausgegeben werden??
| M hat Folgendes geschrieben: |
Aber mal allgemeiner:
Wenn ich das, was du vorhast so richtig verstanden habe, dann kannst du dir die ganze Geschichte mit dem SELECT und dem if($exists) sparen. Du nimmst die gewünschten Werte vom User entgegen, machst ein SELECT mit diesen und überprüfst hinterher ob du mehr als 0 Zeilen bekommst. Das heißt ja dann, das der Termin schon belegt ist. de2.php.net
Deine jetzige Abfrage macht ja genau das Gegenteil, sie läst nur Einträge durch, die schon belegt sind 
|
Hier überforderst Du mein Wissen leider etwas, schaue mir aber num_rows nochmal näher an - Ich bin ein absoluter Newbee in Sachen PHP und MySql - Ich lerne nur autodidaktisch, Bücher, Foren, TuT´s
| M hat Folgendes geschrieben: |
Zum debugen eignen sich ganz gut var_dump() und print_r().
Wobei print_r schnell unübersichtlich wird, wenn du es dir im Browser ausgeben läst, dann einfach ein echo '<pre>'; davor und ein echo '</pre>'; dahinter.
|
Das habe ich gepeilt, hatte es nur rausgenommen aus dem Code
| M hat Folgendes geschrieben: |
Vergewissere dich auch, das error_reporting auf E_ALL steht und display_errors eingeschaltet ist. |
Oh jeh, ich muss noch viel lernen - Ist nicht einfach, wenn man sich das selber versucht beizubringen - Aber ich bleibe dran
Nochmals vielen Dank für Deine Hilfestellung
_________________
Computerstörungen sitzen immer ca. 50 cm. vor dem Bildschirm 
|
|
| Nach oben |
|
 |
M
Anmeldedatum: 05.11.2007 Beiträge: 107 Wohnort: Aachen
|
Verfasst am: Sa 21 März, 2009 03:03 Titel: |
|
|
Genau so, habe ich das auch gemacht und mache es noch immer. IMHO ist learning by doing immernoch das Beste 
Von stand in deinem Post nur nichts, deswegen habe ich gefragt. Aber ein paar Beiträge vorher hatten wir ja auch gesagt, dass man das so nicht in einem SQL Query verwenden sollte. Am besten postest du nochmal den ganzen Code, dann kann dir eher geholfen werden.
Aber ich will versuchen das nochmal genauer zu erklären.
Angenommen, du hast in deiner Tabelle einige Termine eingetragen.
Nun will ein User einen neuen eintragen und du verhindern, dass es zu Überschneidungen kommt. Du musst nun also feststellen, ob der Termin schon belegt ist. Das kannst du ganz einfach machen, in dem du ein Query verwendest, das alle Einträge für diesen konkreten Termin anfordert. Ein solches hast du ja bereits da.
| Code: |
$result = mysql_query("SELECT tag, uhrzeit FROM $table WHERE tag = '".$tag."' AND uhrzeit = '".$uhrzeit."'");
|
Jetzt kannst du mit
| Code: |
if( mysql_num_rows( $result ) > 0)
{
//Min. einen Datensatz gefunden -> Termin belegt
}
else
{
//Kein Datensatz gefunden -> Termin noch frei
}
|
abfragen, ob dein Query auf eine oder mehr Zeilen zu trifft. Wenn ja, bedeutet dies ja, dass der Termin schon in der Datenbank vorhanden ist.
Deine Konstruktion mit der foreach-Schleife und dem $exists ist nicht nur umständlich, sondern auch unnötig, da ja durch das Query ohnehin schon nur die Datensätze zurückgegeben werden, bei denen die Angaben mit denen vom User übereinstimmen.
Die Fehlersuche wird unnötig erschwert, wenn du dir von PHP nichts sagen lässt. In deiner Entwicklungsumgebung sollte deswegen error_reporting immer auf E_ALL stehen und display_errors eingeschaltet sein. Das kannst du entweder global in der php.ini machen oder in jedem Script per
| Code: |
error_reporting(E_ALL);
ini_set('display_errors', 1);
|
manuell.
Aus Sicherheitsgründen solltest du auf Produktivsystemen display_errors aber deaktivieren und Fehler statt dessen in eine Datei loggen (oder gleich einen eigenen Errorhandler implementieren). Aber ich denke, das kannst du dir dann nochmal angucken, wenn 's soweit ist.[/code]
|
|
| Nach oben |
|
 |
Beepa
Anmeldedatum: 05.11.2007 Beiträge: 53 Wohnort: Düsseldorf
|
Verfasst am: So 22 März, 2009 14:25 Titel: |
|
|
Moin zusammen,
@Christoph: ich stimme M da völlig zu - das mit der foreach() ist mit der "SQL-Prüfung" durch das vorgeschaltete SELECT-Statement hinfällig...
Ich erkenne da ein wenig den Punkt 2 von meinem Posting vom 19.02.2009 wieder - der hat aber eher einen erklärenden Sinn gehabt,
warum es mit dem Konstrukt seinerzeit nicht hätte klappen können und sollte alternative Möglichkeiten aufzeigen,
wie man diesen Ansatz hätte umsetzen können. In dem aktuellen Fall kann es halt ohne einen mehrfachen Durchlauf geprüft werden, in anderen eventuell nicht...
Ich hoffe, da nicht für Verwirrung bei dir gesorgt zu haben 
Gruß
Beepa
|
|
| Nach oben |
|
 |
Christoph
Anmeldedatum: 17.02.2009 Beiträge: 38 Wohnort: Köln
|
Verfasst am: So 22 März, 2009 14:31 Titel: |
|
|
Ich denke, ich habe in der Theorie verstanden, was Du mir sagen willst - Danke für Deine ausführliche Erklärung.
Also normalerweise arbeite ich bei $_POST mit addslashes, hatte das nur mal zum ausprobieren rausgenommen. Hier jetzt mal mein komplettes Script (noch nicht weiter bearbeitet):
send.php
| Code: |
<html>
<head>
<script language="JavaScript">
function pruefung(send)
{
if(send.nickname.value.length < 1 )
{
alert("Bitte gib Deinen Nicknamen ein")
return false
}
if(send.tag.value.length < 1 )
{
alert("Bitte wähle einen Sendetag aus")
return false
}
if(send.uhrzeit.value.length < 1 )
{
alert("Bitte wähle eine Uhrzeit aus")
return false
}
if(send.sendungsname.value.length < 1 )
{
alert("Bitte gib einen Sendungsnamen an")
return false
}
else alert("Dein Eintrag wird überprüft")
return true
}
</script>
</head>
<body>
<?php
include ("config/db_config.php");
?>
<form name="send" method="POST" onSubmit="return pruefung(this)"
action="http://www.radio-mittelrhein.de/sendeplanscript/send.php">
<table border="1">
<tr>
<td>Nickname</td>
<td><input name="nickname"></td>
</tr>
<tr>
<td>Tag</td>
<td><select size="1" name="tag">
<option value="Montag">Montag</option>
<option value="Dienstag">Dienstag</option>
<option value="Mittwoch">Mittwoch</option>
<option value="Donnerstag">Donnerstag</option>
<option value="Freitag">Freitag</option>
<option value="Samstag">Samstag</option>
<option value="Sonntag">Sonntag</option>
</select></td>
</tr>
<tr>
<td>Uhrzeit</td>
<td><select size="1" name="uhrzeit">
<option value="16-18 Uhr">16-18 Uhr</option>
<option value="18-20 Uhr">18-20 Uhr</option>
<option value="20-22 Uhr">20-22 Uhr</option>
<option value="22-00 Uhr">22-00 Uhr</option>
</select></td>
</tr>
<tr>
<td>Sendungsname</td>
<td><input name="sendungsname"></td>
</tr>
</table>
<input type="submit" value="Absenden" name="B1"><input type="reset" value="Zurücksetzen" name="B2">
</form>
</body>
</html>
<?php
$select = "SELECT tag, uhrzeit FROM $table WHERE tag = '".$tag."' AND uhrzeit = '".$uhrzeit."' ";
$result = mysql_query($select);
$data_array = array();
while($row = mysql_fetch_assoc($result))
{
$tmp = array();
$tmp['tag'] = $row['tag'];
$tmp['uhrzeit'] = $row ['uhrzeit'];
$data_array[] = $tmp;
}
$exists = false;
foreach($data_array as $index => $data)
{
if($data['tag'] == $_POST['tag'] && $data['uhrzeit'] == $_POST['uhrzeit'])
$exists = true;
}
if($exists === true)
{
$nickname = (addslashes ($_POST ['nickname'] ));
$tag = (addslashes ($_POST ['tag'] ));
$uhrzeit = (addslashes ($_POST ['uhrzeit'] ));
$sendungsname = (addslashes ($_POST ['sendungsname'] ));
$eintrag = "INSERT INTO $table (nickname, tag, uhrzeit, sendungsname)
VALUES ('$nickname', '$tag', '$uhrzeit', '$sendungsname' )";
mysql_query ($eintrag);
echo "Dein Eintrag wurde erfolgreich gespeichert";
}
else
{
echo "Dieser Sendeplatz ist bereits belegt";
}
?>
|
_________________
Computerstörungen sitzen immer ca. 50 cm. vor dem Bildschirm 
|
|
| Nach oben |
|
 |
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB2.de
|