zwerg: Zufallszugriff auf MySQL-DB klappt net

Glück auf!

Ich bin am verzweifeln. Habe aus einem Buch ein Skript für
ein Zufallsmotto abgeschrieben. In der MySQL-Tabelle:
 "motto_tabelle" habe ich z. Zt. 4 Einträge und will diese
(und später weitere) mit PHP auslesen.
Jetzt suche ich schon seit 4 Stunden nach dem Fehler,
weil ich - wie gesagt - das Skript nahezu inhaltsgleich
abgeschrieben hab (lediglich der Name der Tabelle ist
anders).
Wäre nett, wenn sich jmd. mal das Skript ansieht, ob
er da einen (oder mehrere) Fehler findet:

<!-- Verbindung zur Datenbank aufbauen -->
<?php include ("../MySQL/mysql.inc"); ?>
<!-- Ermittlung einer Zufallszahl aus der Gesamtzahl der Tabelleneinträge -->
<?php
$query = "SELECT COUNT(*) FROM motto_tabelle";
$sql = mysql_query ($query);
$max = mysql_result ($sql,0);
$id = rand (1,$max);
?>
<!-- Schreiben des zufälligen Tabelleneintrages in Variablen -->
<?php
$query = "SELECT motto, quelle FROM motto_tabelle WHERE id = $id";
$sql = mysql_query($query);
$ds = mysql_fetch_object($sql);
$motto = htmlentities ($ds -> motto);
$quelle = htmlentities($ds -> quelle);
mysql_close($dz);
?>

Die Verbindung wird offenbar richtig aufgebaut. Habe
das getestet, indem ich mir alle Inhalte der Tabelle
fehlerfrei anzeigen lassen hab.

Das Motto und die Quellenangabe füge ich weiter unten
im HTML-Dokument mit:

<!-- Ende Eintragungen -->
<hr />
<!-- Zufallsmotto -->
<?php echo "$motto" ?><br /><i><?php echo "$quelle" ?></i>

ein.

Ich hoffe das verstößt jetzt net allzu sehr gegen die
Foren-Regeln. Wenn doch, wäre ich dankbar, wenn mir
wenigstens die Problemzeile geschildert wird, dann sehe
ich die mir selber nochmal an.

Beste Grüße
Zwerg Alex

  1. Moin zwerg,

    Ich hoffe das verstößt jetzt net allzu sehr gegen die
    Foren-Regeln.

    Nö, aber was sagen Dir die Fehlermeldungen? Gibt es welche?
    Und was sagt Dir insbesondere die Funktion print mysql_error();

    regds
    Mike©

    --
    Freunde kommen und gehen. Feinde sammeln sich an.
    1. Moin, moin!

      Nö, aber was sagen Dir die Fehlermeldungen? Gibt es welche?

      Bekomme keine Fehlermeldung(en).

      Und was sagt Dir insbesondere die Funktion print mysql_error();

      Hab ich noch nie was von gehört. Wie und wo und zu welchem
      Zweck gebe ich das ein?

      1. Moin zwerg,

        Und was sagt Dir insbesondere die Funktion print mysql_error();

        Hab ich noch nie was von gehört. Wie und wo und zu welchem
        Zweck gebe ich das ein?

        Das liest Du bitte mal hier nach:
        http://de.php.net/manual/de/function.mysql-error.php

        regds
        Mike©

        --
        Freunde kommen und gehen. Feinde sammeln sich an.
        1. Sorry, hab etwas voreilig gefragt. Hab da auch
          beim "googeln" was zu gefunden.

          Das liest Du bitte mal hier nach:
          http://de.php.net/manual/de/function.mysql-error.php

          Also mit "echo mysql_errno() . ": " . mysql_error(). "\n";"
          kriege ich "0:" bzw. einmal nur ":", also hilft das wohl auch
          net weiter. Oder?

          1. Habe gerade festgestellt, dass die ID (Primärschlüssel der
            Tabelle nicht von 1-4 sondern 10, 11, 12 und 15 ist (hatte
            zwischendurch was gelöscht. Liegt womöglich da der Fehler?

            1. Moin zwerg,

              Habe gerade festgestellt, dass die ID (Primärschlüssel der
              Tabelle nicht von 1-4 sondern 10, 11, 12 und 15 ist (hatte
              zwischendurch was gelöscht. Liegt womöglich da der Fehler?

              Nein.

              regds
              Mike©

              --
              Freunde kommen und gehen. Feinde sammeln sich an.
              1. Na ja, doch, irgendwie schon

                Auszug aus seinem Code:
                $id = rand (1,$max);
                $query = "SELECT motto, quelle FROM motto_tabelle WHERE id = $id";

                Die Tabelle hat also 4 Sätze. Select COUNT(*) liefert also als Wert für $max 4, $id wird demnach 1..4 - diese Sätze existieren aber nicht.

                @zwerg: Nein nein, das ist kein Fehler, IDs sollen lediglich eindeutig sein, von durchgängig und niedrig hat keiner was gesagt, auch wenn viele das immer wieder glauben.
                Der grundsätzliche Ansatz der Ermittlung ist unglücklich. Einfacher wäre der Datenbank zu sagen, sie möde nach einem Zufallswert sortieren. Anschließend nimmt man einfach das Ergebnis, das sie als erstes liefert, also schematisch etwa:
                SELECT motto, quelle FROM motto_tabelle ORDER BY RAND() LIMIT 1
                -> anschließend einfach mit PHP auslesen wie bisher auch angedacht. Das vorherige mit SELECT COUNT(*) etc. kann man sich sparen.

                MfG
                Rouven

                --
                -------------------
                Death is nature's way of telling you to slow down.
                1. Moin Rouven,

                  Na ja, doch, irgendwie schon

                  Auszug aus seinem Code:
                  $id = rand (1,$max);
                  $query = "SELECT motto, quelle FROM motto_tabelle WHERE id = $id";

                  Die Tabelle hat also 4 Sätze. Select COUNT(*) liefert also als Wert für $max 4, $id wird demnach 1..4 - diese Sätze existieren aber nicht.

                  Yep, Du hast Recht und ich habe das in dieser Tiefe nicht betrachtet, da ich befürchte das zwerg die Grundlagen noch nicht so ganz inne hat.
                  (Asche auf mein Haupt)
                  Ich wollte zwerg dazu bewegen sich mal mit der eigentlichen Materie zu beschäftigen.

                  regds
                  Mike©

                  --
                  Freunde kommen und gehen. Feinde sammeln sich an.
                  1. Yep, Du hast Recht und ich habe das in dieser Tiefe nicht betrachtet, da ich befürchte das zwerg die Grundlagen noch nicht so ganz inne hat.
                    (Asche auf mein Haupt)
                    Ich wollte zwerg dazu bewegen sich mal mit der eigentlichen Materie zu beschäftigen.

                    Stimmt schon und du hast recht, dass ich die Grundlagen noch
                    net inne hab. Aber ich dachte learning per doin wär die beste
                    Methode.
                    Danke, dass du dich mit meinem Problem beschäftigt hast.

                2. @zwerg: Nein nein, das ist kein Fehler, IDs sollen lediglich eindeutig sein, von durchgängig und niedrig hat keiner was gesagt, auch wenn viele das immer wieder glauben.
                  Der grundsätzliche Ansatz der Ermittlung ist unglücklich. Einfacher wäre der Datenbank zu sagen, sie möde nach einem Zufallswert sortieren. Anschließend nimmt man einfach das Ergebnis, das sie als erstes liefert, also schematisch etwa:
                  SELECT motto, quelle FROM motto_tabelle ORDER BY RAND() LIMIT 1
                  -> anschließend einfach mit PHP auslesen wie bisher auch angedacht. Das vorherige mit SELECT COUNT(*) etc. kann man sich sparen.

                  Danke für den Tipp. Werde mich in diese Richtung mal schlau machen.
                  Noch nen angenehmes Wochenende.

          2. Moin zwerg,

            Also mit "echo mysql_errno() . ": " . mysql_error(). "\n";"
            kriege ich "0:" bzw. einmal nur ":", also hilft das wohl auch
            net weiter. Oder?

            du musst es richtig einsetzen. Ich befürchte das Du es nicht auf die Husche und vielleciht auch nicht um diese Uhrzeit hinbekommst.

            Ein geeignter Punkt wäre hier. (Habe ich nicht als potenielle Fehlerquelle gecheckt, ist nur ein Beispiel)

              
            $max = mysql_result ($sql,0);  
              
            if (!$max)  
            {  
                print mysql_error();  
                die("Query $query ist ungültiges SQL.");  
            }  
            
            

            BTW: Deine Syntax stimmt nicht. Bitte nimm das SQL Handuch zu Hilfe.

            regds
            Mike©

            --
            Freunde kommen und gehen. Feinde sammeln sich an.
            1. du musst es richtig einsetzen. Ich befürchte das Du es nicht auf die Husche und vielleciht auch nicht um diese Uhrzeit hinbekommst.

              Du hast wohl recht. Aber danke für deine Mühen. Werd das wohl
              erstmal verschieben, bis ich etwas fiter in PHP und MySQL bin.

              BTW: Deine Syntax stimmt nicht. Bitte nimm das SQL Handuch zu Hilfe.

              Hab vor meinem Posting die Bücher gewälzt, leider ohne Erfolg.

              Angenehmen "Abend" noch.

              Gruß
              Zwerg Alex

              1. Moin zwerg,

                Du hast wohl recht. Aber danke für deine Mühen. Werd das wohl
                erstmal verschieben, bis ich etwas fiter in PHP und MySQL bin.

                habe ich es überlesen, oder hast Du niergendwo geschildert was passiert. Bzw. was nicht passiert?

                Deine Original Beschreibung lautet: "klappt net"
                Hmmm, "klappt net zu" oder was?

                Bitte liefere eine genauere Beschreibung. Was "klappt net" und wie äußert sich das?

                regds
                Mike©

                --
                Freunde kommen und gehen. Feinde sammeln sich an.
                1. habe ich es überlesen, oder hast Du niergendwo geschildert was passiert. Bzw. was nicht passiert?

                  Es passiert garnichts. Ich bekomme weder eine Fehlermeldung,
                  noch gibt mir
                  "<?php echo "$motto" ?><br /><i><?php echo "$quelle"; ?>"
                  irgendetwas aus.

                  Deine Original Beschreibung lautet: "klappt net"
                  Hmmm, "klappt net zu" oder was?

                  Bitte liefere eine genauere Beschreibung. Was "klappt net" und wie äußert sich das?

                  Ich weiß ja nicht, was net klappt; also wo der Fehler liegt.
                  Ob es an der Zufalls-ID liegt oder ob ich irgendwas vergessen
                  hab. Normalerweise bekomme ich ja immer eine Fehlermeldung,
                  dann weiß ich, wo ich nachlesen kann bzw. kann damit
                  die Suchmaschinen bemühen.
                  Deswegen habe ich das komplette Skript gepostet, dachte
                  vlt. liegt da ein (für Gurus) offensichtlicher Fehler drin.

                  P.S. Wollte net unhöflich klingen, aber ich dachte "wir" finden
                  heute eh keine Lösung mehr und du hast die Lust daran verloren
                  dich dessen anzunehmen und wollte deshalb den Thread schließen.

                  1. Moin zwerg,

                    P.S. Wollte net unhöflich klingen, aber ich dachte "wir" finden
                    heute eh keine Lösung mehr und du hast die Lust daran verloren
                    dich dessen anzunehmen und wollte deshalb den Thread schließen.

                    Nö, die Lust stirbt zuletzt :-)
                    Brachte Dich Rouvens Hinweis weiter?

                    regds
                    Mike©

                    --
                    Freunde kommen und gehen. Feinde sammeln sich an.
                  2. Moin zwerg,

                    habe ich es überlesen, oder hast Du niergendwo geschildert was passiert. Bzw. was nicht passiert?

                    ich werde mich jetzt auf die Matraze hauen. Als Tip noch. Bitte lasse Dir die Variablen ausgeben und prüfe ob sie Deinen erwarteten Ergebnissen entsprechen.
                    (Ich behalte diesen Thread im Auge)

                    regds
                    Mike©

                    --
                    Freunde kommen und gehen. Feinde sammeln sich an.
            2. echo $begrüßung;

              $max = mysql_result ($sql,0);

              if (!$max)
              {
                  print mysql_error();
                  die("Query $query ist ungültiges SQL.");
              }

              Das geht so nicht, denn wenn in der ersten Spalte der ersten Zeile '0' oder 0 steht ergibt !$max auch true und das ist ja wohl kein Fehler. Hier sollte mit einem typsicheren === auf false geprüft werden, denn false kann von MySQL nicht zurückgegeben werden, weil keinen boolschen Datentyp kennt. (Und nein, BOOL und BOOLEAN sind keine boolschen Datentypen sondern Aliase auf TINYINT(1), also Integer.)

              echo "$verabschiedung $name";

  2. echo $begrüßung;

    Die Verbindung wird offenbar richtig aufgebaut.

    Es besteht kein Grund, hier zu raten. Wenn eine der mysql_*-Funktionen einen Fehler feststellt gibt sie false zurück. Auf diesen Rückgabewert ist unbedingt einzugehen, weil er zum einen kein gültiges Argument für nachfolgende mysql_*-Funktionen darstellt, welche sich mit einer PHP-Fehlermeldung beschweren, und zum anderen ein normales Weiterlaufen nach einem Fehler sinnlos wird.

    echo "$verabschiedung $name";