bituniverse.com Foren-Übersicht bituniverse.com
Entwickler Forum
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Projekt Sendeplan - Datenbankstruktur
Gehe zu Seite Zurück  1, 2, 3, 4  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    bituniverse.com Foren-Übersicht -> Datenbanken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Simon W.
Anti-verdenglischungs-Abgeordneter


Anmeldedatum: 05.11.2007
Beiträge: 283
Wohnort: Aachen

BeitragVerfasst am: Do 19 Feb, 2009 14:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beepa



Anmeldedatum: 05.11.2007
Beiträge: 53
Wohnort: Düsseldorf

BeitragVerfasst am: Do 19 Feb, 2009 14:47    Titel: Antworten mit Zitat

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 Smile (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:
  1. Query absetzen
  2.    
  3.     Wenn(Anzahl Datensätze == 0)
  4.       Termin eintragen
  5.     Sonst
  6.       Datensatz aus Resultset auslesen (mysql_fetch_array())
  7.       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:
  1. <?php
  2.  
  3.  
  4.   // Beispiel while() mit Array
  5.  
  6.   // Haupt-Array deklarieren
  7.   $data_array = array();
  8.  
  9.   // While-Schleife
  10.   while($row = mysql_fetch_assoc($result))
  11.   {
  12.     // temp.Unterarray deklarieren - wird in jedem
  13.     // Durchlauf überschrieben
  14.     $tmp = array();
  15.     $tmp['tag'] = $row['tag'];
  16.     $tmp['uhrzeit'] = $row ['uhrzeit'];
  17.    
  18.     // temp.Array ins Hauptarray übernehmen
  19.     $data_array[] = $tmp;
  20.    
  21.   }
  22.  
  23.   // Debug-Ausgabe des Hauptarrays um den Aufbau zu zeigen
  24.   echo '<pre>', print_r($data_array, 1), '</pre>';
  25.  
  26.  
  27. ?>

Gehen wir davon aus, dass du mit dem Array-Beispiel eine Prüfung durchführen möchtest:

Php:
  1. <?php
  2.  
  3.   $exists = false;
  4.  
  5.   foreach($data_array as $index => $data)
  6.   {
  7.     if($data['tag'] == $_POST['tag'] && $data['uhrzeit'] == $_POST['uhrzeit'])
  8.       $exists = true;
  9.   }
  10.  
  11.   if($exists === true)
  12.   {
  13.     // Termin eintragen
  14.   }
  15.   else
  16.   {
  17.     // Termin belegt
  18.   }
  19.  
  20. ?>

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 Smile

Gruß

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beepa



Anmeldedatum: 05.11.2007
Beiträge: 53
Wohnort: Düsseldorf

BeitragVerfasst am: Do 19 Feb, 2009 14:59    Titel: Antworten mit Zitat

Laughing

Mir fällt gerade ein, dass es noch einfacher gehen würde, aber ich will deine Vorkenntnisse nicht strapzieren Wink

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
Benutzer-Profile anzeigen Private Nachricht senden
Gast






BeitragVerfasst am: So 08 März, 2009 04:49    Titel: Antworten mit Zitat

@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

BeitragVerfasst am: Fr 20 März, 2009 18:12    Titel: Antworten mit Zitat

Soderle,

erstmal einen schönen guten Abend zusammen Smile

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:
  1. <?php
  2.  
  3. include ("config/db_config.php");
  4.  
  5.   $select = "SELECT tag, uhrzeit FROM $table WHERE tag = '".$tag."' AND uhrzeit = '".$uhrzeit."' ";
  6.   $result = mysql_query($select);
  7.    
  8.  
  9.   $data_array = array();
  10.  
  11.   while($row = mysql_fetch_assoc($result))
  12.   {
  13.   $tmp = array();
  14.   $tmp['tag'] = $row['tag'];
  15.   $tmp['uhrzeit'] = $row ['uhrzeit'];
  16.  
  17.   $data_array[] = $tmp;
  18.   }
  19.  
  20.   $exists = false;
  21.   foreach($data_array as $index => $data)
  22.   {
  23.     if($data['tag'] == $_POST['tag'] && $data['uhrzeit'] == $_POST['uhrzeit'])
  24.     $exists = true;
  25.   }
  26.  
  27.   if($exists === true)
  28.  
  29.   {
  30.  
  31.   $nickname          = $_POST ['nickname'];
  32.   $tag               = $_POST ['tag'];
  33.   $uhrzeit           = $_POST ['uhrzeit'];
  34.   $sendungsname      = $_POST ['sendungsname'];
  35.  
  36.   $eintrag = "INSERT INTO $table (nickname, tag, uhrzeit, sendungsname)
  37.   VALUES ('$nickname', '$tag', '$uhrzeit', '$sendungsname' )";
  38.  
  39.   mysql_query ($eintrag);
  40.   #mysql_close ();
  41.   echo "Dein Eintrag wurde erfolgreich gespeichert";
  42.   }
  43.  
  44.   else
  45.  
  46.   {
  47.   echo "Dieser Sendeplatz ist bereits belegt";
  48.   }
  49.  
  50.   echo $tag;
  51.    
  52. ?>

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 Wink

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
M



Anmeldedatum: 05.11.2007
Beiträge: 107
Wohnort: Aachen

BeitragVerfasst am: Fr 20 März, 2009 20:14    Titel: Antworten mit Zitat

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 Wink

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Christoph



Anmeldedatum: 17.02.2009
Beiträge: 38
Wohnort: Köln

BeitragVerfasst am: Fr 20 März, 2009 23:38    Titel: Antworten mit Zitat

Hi @M

erstmal Danke für Deine Antwort Smile

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

Code:
  1. $tag = $_POST ['tag'];

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 Wink

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 Wink

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
M



Anmeldedatum: 05.11.2007
Beiträge: 107
Wohnort: Aachen

BeitragVerfasst am: Sa 21 März, 2009 03:03    Titel: Antworten mit Zitat

Genau so, habe ich das auch gemacht und mache es noch immer. IMHO ist learning by doing immernoch das Beste Wink

Von
Code:
  1. $tag = $_POST['tag'];
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:
  1. $result = mysql_query("SELECT tag, uhrzeit FROM $table WHERE tag = '".$tag."' AND uhrzeit = '".$uhrzeit."'");

Jetzt kannst du mit

Code:
  1. if( mysql_num_rows( $result ) > 0)
  2. {
  3. //Min. einen Datensatz gefunden -> Termin belegt
  4. }
  5. else
  6. {
  7. //Kein Datensatz gefunden -> Termin noch frei
  8. }

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. Wink 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:
  1. error_reporting(E_ALL);
  2. 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beepa



Anmeldedatum: 05.11.2007
Beiträge: 53
Wohnort: Düsseldorf

BeitragVerfasst am: So 22 März, 2009 14:25    Titel: Antworten mit Zitat

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 Smile

Gruß

Beepa

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christoph



Anmeldedatum: 17.02.2009
Beiträge: 38
Wohnort: Köln

BeitragVerfasst am: So 22 März, 2009 14:31    Titel: Antworten mit Zitat

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:
  1. <html>
  2. <head>
  3.  
  4. <script language="JavaScript">
  5.      
  6.       function pruefung(send)
  7.       {    
  8.           if(send.nickname.value.length < 1 )
  9.           {
  10.               alert("Bitte gib Deinen Nicknamen ein")
  11.               return false
  12.           }
  13.  
  14.        
  15.         if(send.tag.value.length < 1 )
  16.           {
  17.               alert("Bitte wähle einen Sendetag aus")
  18.               return false
  19.           }
  20.  
  21.        
  22.         if(send.uhrzeit.value.length < 1 )
  23.           {
  24.               alert("Bitte wähle eine Uhrzeit aus")
  25.               return false
  26.           }
  27.          
  28.          
  29.           if(send.sendungsname.value.length < 1 )
  30.           {
  31.               alert("Bitte gib einen Sendungsnamen an")
  32.               return false
  33.           }
  34.            
  35.           else alert("Dein Eintrag wird überprüft")
  36.             return true
  37.         }
  38. </script>
  39.  
  40. </head>
  41. <body>
  42.  
  43. <?php
  44. include ("config/db_config.php");
  45.  
  46. ?>
  47.  
  48. <form name="send" method="POST" onSubmit="return pruefung(this)"
  49. action="http://www.radio-mittelrhein.de/sendeplanscript/send.php">
  50.  
  51. <table border="1">
  52.   <tr>
  53.     <td>Nickname</td>
  54.     <td><input name="nickname"></td>
  55.   </tr>  
  56.  
  57.   <tr>
  58.     <td>Tag</td>
  59.     <td><select size="1" name="tag">
  60.   <option value="Montag">Montag</option>
  61.   <option value="Dienstag">Dienstag</option>
  62.   <option value="Mittwoch">Mittwoch</option>
  63.   <option value="Donnerstag">Donnerstag</option>
  64.   <option value="Freitag">Freitag</option>
  65.   <option value="Samstag">Samstag</option>
  66.   <option value="Sonntag">Sonntag</option>
  67.   </select></td>
  68.   </tr>
  69.  
  70.   <tr>
  71.     <td>Uhrzeit</td>
  72.     <td><select size="1" name="uhrzeit">
  73.   <option value="16-18 Uhr">16-18 Uhr</option>
  74.   <option value="18-20 Uhr">18-20 Uhr</option>
  75.   <option value="20-22 Uhr">20-22 Uhr</option>
  76.   <option value="22-00 Uhr">22-00 Uhr</option>
  77.   </select></td>
  78.   </tr>
  79.  
  80.   <tr>
  81.     <td>Sendungsname</td>
  82.     <td><input name="sendungsname"></td>
  83.   </tr>
  84. </table>
  85. <input type="submit" value="Absenden" name="B1"><input type="reset" value="Zurücksetzen" name="B2">
  86. </form>
  87. </body>
  88. </html>
  89.  
  90. <?php
  91.  
  92.   $select = "SELECT tag, uhrzeit FROM $table WHERE tag = '".$tag."' AND uhrzeit = '".$uhrzeit."' ";
  93.   $result = mysql_query($select);
  94.    
  95.  
  96.   $data_array = array();
  97.  
  98.   while($row = mysql_fetch_assoc($result))
  99.   {
  100.   $tmp = array();
  101.   $tmp['tag'] = $row['tag'];
  102.   $tmp['uhrzeit'] = $row ['uhrzeit'];
  103.  
  104.   $data_array[] = $tmp;
  105.   }
  106.  
  107.   $exists = false;
  108.   foreach($data_array as $index => $data)
  109.   {
  110.     if($data['tag'] == $_POST['tag'] && $data['uhrzeit'] == $_POST['uhrzeit'])
  111.     $exists = true;
  112.   }
  113.  
  114.   if($exists === true)
  115.  
  116.   {
  117.  
  118.   $nickname          = (addslashes ($_POST ['nickname'] ));
  119.   $tag               = (addslashes ($_POST ['tag'] ));
  120.   $uhrzeit           = (addslashes ($_POST ['uhrzeit'] ));
  121.   $sendungsname      = (addslashes ($_POST ['sendungsname'] ));
  122.  
  123.   $eintrag = "INSERT INTO $table (nickname, tag, uhrzeit, sendungsname)
  124.   VALUES ('$nickname', '$tag', '$uhrzeit', '$sendungsname' )";
  125.  
  126.   mysql_query ($eintrag);
  127.  
  128.   echo "Dein Eintrag wurde erfolgreich gespeichert";
  129.   }
  130.  
  131.   else
  132.   {
  133.  
  134.   echo "Dieser Sendeplatz ist bereits belegt";
  135.  
  136.   }
  137. ?>


_________________

Computerstörungen sitzen immer ca. 50 cm. vor dem Bildschirm Wink

Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    bituniverse.com Foren-Übersicht -> Datenbanken Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2, 3, 4  Weiter
Seite 2 von 4

 
Gehe zu:  
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
Powered by WebRing.