Daniel: MySQL Datenbankabfrage bereitet schwere probleme!

hi leute,

habe hier ne DB-abfrage die einfach net hinhauen will:

$id   = $_GET["id"];
$pic_uid = $_GET["uid"];

$getinfos = mysql_query("SELECT
                                COUNT(*)
                            FROM
                                ttl_galleries_nick
                            WHERE
                                ttl_galleries_nick.uid = '$pic_uid'
                                AND ttl_galleries_nick.pic = '$id'
       LIMIT 1
         ") or die(mysql_error());

$noc = mysql_num_rows($getinfos);

echo $id;
echo "<br><br>";
echo $pic_uid;
echo "<br><br>";
echo $noc;

if($noc == 1)
 {

ich weiß absolut nicht wieso aber da kommt einfach immer 1 RAUS!!! egal was ich mache wenn ich die id oder die pic_uid ändern sollte MUSS da doch null raus kommen weil jeder eintrag nur einmal vorhanden ist! sitze da jetzt fast 2 stunden dran NUR an dem problem und komme nimmer weiter! kann mir einer von euch helfen?

mfg dani

  1. nAbend,

    $id   = $_GET["id"];
    $pic_uid = $_GET["uid"];

    die werte an dieser stelle unbedingt valedieren.

    $getinfos = mysql_query("SELECT
                                    COUNT(*)
                                FROM
                                    ttl_galleries_nick
                                WHERE
                                    ttl_galleries_nick.uid = '$pic_uid'
                                    AND ttl_galleries_nick.pic = '$id'
           LIMIT 1
             ") or die(mysql_error());

    hast du mal probiert die anführungszeichen für die werte zu entfernen?
    sprich
    »»WHERE ttl_galleries_nick.uid = '$pic_uid'
    wird zu
    WHERE ttl_galleries_nick.uid = $pic_uid.

    denn bei integer-werten entfallen die anführungszeichen.

    mfg
    feurio

    --
    Marinus, Marinus, hoerst du mich?
    Marinus, Marinus, du warst es nicht!
    SelfCode:e:{ fl:{ br:^ va:| ls:~ fo:) rl:( n4:? ss:} de:] js:{ ch:? sh:( mo:? zu:(
    1. Moin!

      denn bei integer-werten entfallen die anführungszeichen.

      Nein, man KANN sie weglassen, man MUSS es aber nicht.

      Und es ist insbesondere bei Integerwerten, die von außen eingefügt werden (Benutzerinteraktion etc.) extrem sinnvoll, sowohl Anführungszeichen als auch mysql_escape_string() anzuwenden, um SQL-Code-Injection zu verhindern.

      - Sven Rautenberg

      1. nAbend,

        Nein, man KANN sie weglassen, man MUSS es aber nicht.

        hmm.
        '2' != 2 - oder sehe ich da etwas falsch?

        mfg
        feurio

        --
        Marinus, Marinus, hoerst du mich?
        Marinus, Marinus, du warst es nicht!
        SelfCode:e:{ fl:{ br:^ va:| ls:~ fo:) rl:( n4:? ss:} de:] js:{ ch:? sh:( mo:? zu:(
        1. öhmm in wie fern nun einbauen? sagt mir net soo viel... :-/

          mfg dani

          1. wieso eigentlich 2? der wert geht niemals auf zwei wenn er falsch oder wenn er richtig ist er bleibt immer auf 1!

            mfg dani

            1. nAbend,

              wieso eigentlich 2? der wert geht niemals auf zwei wenn er falsch oder wenn er richtig ist er bleibt immer auf 1!

              war doch nur eine dummy-zahl ;-))

              mfg
              feurio

              --
              Marinus, Marinus, hoerst du mich?
              Marinus, Marinus, du warst es nicht!
              SelfCode:e:{ fl:{ br:^ va:| ls:~ fo:) rl:( n4:? ss:} de:] js:{ ch:? sh:( mo:? zu:(
        2. Moin!

          nAbend,

          Nein, man KANN sie weglassen, man MUSS es aber nicht.
          hmm.
          '2' != 2 - oder sehe ich da etwas falsch?

          Wir reden hier von SQL, genauer von MySQL. Wie die Datenbank Zahlen und Strings interpretiert, ist ihre Sache und kann von der Art und Weise, wie dies andere Programmiersprachen tun, durchaus abweichen.

          MySQL ist, genau wie PHP, eine Sprache ohne feste Datentypen. Schlimmer noch als PHP kennt MySQL nicht mal komplexe Datentypen wie Arrays, sondern wirklich nur die einfachen Datentypen String und Zahl. Und bei Zahlen ist es wirklich total egal, ob die nun innerhalb von Anführungszeichen stehen, oder nicht - denn weil sie die Datenbank nur innerhalb des SQL-Strings erreichen können, sind ohnehin sämtliche Zahlen in die Stringdarstellung umgewandelt, es gibt also keinen Speichervorteil für Integerzahlen oder IEEE-Fließkommazahlen. Der Vorteil der Stringdarstellung auch von Zahlen ist, dass man ohne große Probleme beliebige Genauigkeit bei der Zahldarstellung verwenden kann, außerdem kommt es nicht zwingend zu Rundungsfehlern aufgrund von Binärdarstellung - das dürfte mit ein Grund sein, warum MySQL Fließkommazahlen als String speichert.

          Da MySQL also ohnehin eine Zahleninterpretationsroutine eingebaut haben muß, ist es also ziemlich egal, ob die Zahlen selbst nochmal in Stringbegrenzer eingeschlossen sind, oder nicht. Interpretieren und ermitteln, welcher Zahlenwert gemeint ist, muß MySQL sowieso. Aber mit Stringbegrenzern hat man als Programmierer eben den Vorteil, dass mysql_escape_string() funktioniert.

          - Sven Rautenberg

          1. nAbend,

            ok. danke für die infos

            mfg
            feurio

            --
            Marinus, Marinus, hoerst du mich?
            Marinus, Marinus, du warst es nicht!
            SelfCode:e:{ fl:{ br:^ va:| ls:~ fo:) rl:( n4:? ss:} de:] js:{ ch:? sh:( mo:? zu:(
          2. Hallo Sven,

            Da MySQL also ohnehin eine Zahleninterpretationsroutine eingebaut haben muß, ist es also ziemlich egal, ob die Zahlen selbst nochmal in Stringbegrenzer eingeschlossen sind, oder nicht. Interpretieren und ermitteln, welcher Zahlenwert gemeint ist, muß MySQL sowieso. Aber mit Stringbegrenzern hat man als Programmierer eben den Vorteil, dass mysql_escape_string() funktioniert.

            Aber wenn sowieso nur Integer-Zahlen erwartet werden sehe ich keinen Grund dafür mysql_escape_string() zu verwenden. Mit $foo = (int)$foo kann man noch sicher gehen, dass man wirklich nur Integer-Zahlen in der Datenbank stehen hat.

            Schöne Grüße,

            Johannes

            --
            Das sage ich deshalb, weil ich Hompagebauer bin und Ahnung davon .
            ss:| zu:) ls:[ fo:) de:] va:) ch:) n4:| rl:) br:< js:| ie:{ fl:( mo:}
          3. hat jetzt jemand eine antwort dazu gefunden? ich leider immernoch nicht!! :-/ wenn ja wie muss diese aussehen?

            mfg dani

            1. Moin!

              hat jetzt jemand eine antwort dazu gefunden? ich leider immernoch nicht!! :-/ wenn ja wie muss diese aussehen?

              Hab ich dir doch schon gestern um 18:43 Uhr geschrieben.

              - Sven Rautenberg

            2. hat jetzt jemand eine antwort dazu gefunden? ich leider immernoch nicht!! :-/ wenn ja wie muss diese aussehen?

              eine SQL liefert IMMER eine tabelle als ergebnis (resultset). eine tabelle ist IMMER 2-dimensional (spalten und zeilen)
              die spalten sind die, welche du in SELECT spalten genannt hast.
              die zeilen sind die, welche der WHERE bedingung entsprechen.

              in deiner sql steht SELECT COUNT FROM ..
              wie viele spalten sind das?
              wie viele zeilen sind das?

              lösung: eine tabelle mit EINER spalte und EINER zeile.

  2. Moin!

    ich weiß absolut nicht wieso aber da kommt einfach immer 1 RAUS!!!

    Logisch.

    Du fragst in SQL die Anzahl der Tabellenzeilen mit einer bestimmten UID und ID ab und wertest hinterher aus, wieviele Ergebniszeilen du kriegst.

    Auch wenn SQL selbst die Anzahl mit "Null" ermitteln würde, würde das trotzdem noch immer in einer (!) Ergebniszeile geschehen.

    - Sven Rautenberg

    1. hi,

      Auch wenn SQL selbst die Anzahl mit "Null" ermitteln würde, würde das trotzdem noch immer in einer (!) Ergebniszeile geschehen.

      darüber hinaus wundere ich mich, warum man eine abfrage, die nur ein COUNT() zurückliefern soll, mit einem LIMIT garniert.

      <ironie>
      falls wirklich erwartet wird, dass die DB innerhalb einer anfrage mehrere zählungen mit unterschiedlichem wert zurückgibt, würde ich aber sicherheitshalber noch ein MAX() drumherumschachteln.
      </ironie>

      gruß,
      wahsaga

      --
      "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
      1. yo,

        <ironie>
        falls wirklich erwartet wird, dass die DB innerhalb einer anfrage mehrere zählungen mit unterschiedlichem wert zurückgibt, würde ich aber sicherheitshalber noch ein MAX() drumherumschachteln.
        </ironie>

        <ironie>
        MAX() könnte aber dafür sorgen, dass die maximal-anzahl der gefunden datensätze zurück gegeben wird. deshalb empfehle ich die funktion MIN() zu verwenden, die sicherstellt, dass immer nur ein datensatz geliefert wird.
        </ironie>

        Ilja