Localhorst: Fehler in SQL String (geht nicht immer...)

Hallo Forum,

ich habe einen SQL String, der über eine Schleife aufgerufen wird, aber nicht immer funktioniert.

Ich setzte ihn über PHP mit folgendem Code zusammen

  
$sql_string="SELECT DISTINCT ceil( (TIMESTAMPDIFF(SECOND , NOW( ) , FROM_UNIXTIME( datum ) ) ) /86400 * -1  
) AS days  
FROM `".$row_gehirn_tabellen['gehirn'].$farb_db."`  
WHERE user_id =$user_id and  
status!=0";  
echo $sql_string."<hr>";  
$sql_query=mysql_query($sql_string);  
while($days = mysql_fetch_assoc($sql_query)){  

Den SQL String lasse ich zur Kontrolle gerade ausgeben. Folgender String funktionert.

SELECT DISTINCT ceil( ( TIMESTAMPDIFF( SECOND , NOW( ) , FROM_UNIXTIME( datum ) ) ) /86400 * -1 ) AS days from 16\_96 AG WHERE user_id =1 and status!=0

Bei folgendem String (wo Null als korrektes Ergebnis ausgegeben werden sollte)

SELECT DISTINCT ceil( ( TIMESTAMPDIFF( SECOND , NOW( ) , FROM_UNIXTIME( datum ) ) ) /86400 * -1 ) AS days from 16\_96 Ma duenn WHERE user_id =1 and status!=0

kommt jedoch
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/www/web262/html/brain_collection/funktionen.php on line 254

als Fehlermeldung. Die Tabelle gibt es aber auf jeden Fall. Kann es an den Leerzeichen liegen? Wobei in dem Tabellennamen des ersten Strings ist auch ein Leerzeichen.

Ich kann die SQL Abfrage von Hand in phpMyAdmin zusammen basteln, so dass sie komplett gleich ausschaut, dann klappt es. Kann es sein, dass ich irgendwelche Whitspaces in dem String habe? Auf meinem Windows Testsystem klappt alles, nur auf dem Unix Webspace Server nicht, evtl. hat es auch damit zu tun.

Über etwas Hilfe würde ich mich sehr freuen.

MfG
Localhorst

  1. Mahlzeit Localhorst,

    SELECT DISTINCT ceil( ( TIMESTAMPDIFF( SECOND , NOW( ) , FROM_UNIXTIME( datum ) ) ) /86400 * -1 ) AS days from 16\_96 AG WHERE user_id =1 and status!=0

    SELECT DISTINCT ceil( ( TIMESTAMPDIFF( SECOND , NOW( ) , FROM_UNIXTIME( datum ) ) ) /86400 * -1 ) AS days from 16\_96 Ma duenn WHERE user_id =1 and status!=0

    Du schreibst jetzt bitte 1.000.000 x "Wer Leerzeichen in Tabellen- oder Spaltennamen benutzt, gehört an den Sackhaaren aufgehängt!". Danach änderst Du die Benennung der Tabellen und Spalten und anschließend funktioniert auch alles.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Du schreibst jetzt bitte 1.000.000 x "Wer Leerzeichen in Tabellen- oder Spaltennamen benutzt, gehört an den Sackhaaren aufgehängt!". Danach änderst Du die Benennung der Tabellen und Spalten und anschließend funktioniert auch alles.

      Ok, wird erledigt :-)

      Aber warum klappt es dann bei dem ersten String, welcher offensichtlich auch ein Leerzeichen enthält und bei dem zweiten nicht?

      Auf meinem Windows System klappt es auch?

  2. Hallo,

    $sql_string="SELECT DISTINCT ceil( (TIMESTAMPDIFF(SECOND , NOW( ) , FROM_UNIXTIME( datum ) ) ) /86400 * -1
    ) AS days

    Unix-Timestamps sind meiner Meinung nach eine schlechte Wahl, Zeitpunkte in einer Datenbank abzuspeichern.
    Was soll Deine Berechnung bewirken? Das sieht viel zu kompliziert und vor allem fehlerhaft aus.

    [...]

    $sql_query=mysql_query($sql_string);

    Warum überprüfst Du im Fehlerfall nicht den Inhalt von mysql_error()?
    Tu das!

    while($days = mysql_fetch_assoc($sql_query)){

    
    > SELECT DISTINCT ceil( ( TIMESTAMPDIFF( SECOND , NOW( ) , FROM\_UNIXTIME( datum ) ) ) /86400 \* -1 ) AS days from `16\_96 AG` WHERE user\_id =1 and status!=0  
      
    Deine Tabellennamen sind denkbar schlecht gewählt.  
      
    
    > Bei folgendem String (wo Null als korrektes Ergebnis ausgegeben werden sollte)  
      
    NULL oder 0?  
      
    
    > SELECT DISTINCT ceil( ( TIMESTAMPDIFF( SECOND , NOW( ) , FROM\_UNIXTIME( datum ) ) ) /86400 \* -1 ) AS days from `16\_96 Ma duenn` WHERE user\_id =1 and status!=0  
      
    Warum sind offensichtlich gleichartige Daten in unterschiedlichen Tabellen gespeichert? Sieht nach einem weiteren Designfehler aus.  
      
    
    > Warning: mysql\_fetch\_assoc(): supplied argument is not a valid MySQL result resource in /home/www/web262/html/brain\_collection/funktionen.php on line 254  
      
    Tja, schau' Dir die Ausgabe von [mysql_error](http://www.php.net/manual/de/function.mysql-error.php) an und teile diese uns mit.  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
    1. Hi,

      die Ausgabe von mysql_error() ergibt

      Table 'usr_web262_2.16_96 Ma duenn' doesn't exist

      Es gibt sie aber. Wie bereits geschrieben funktioniert es auch auf dem Windows System. Und der andere Tabellenname mit einem Leerzeichen geht.

      Zu deinen weiteren Anmerkungen:
       nicht NULL sondern
             MySQL lieferte ein leeres Resultat zurück (d. h. null Zeilen). (die Abfrage dauerte 0.0116 sek.)(Diese Ausgabe bekomme ich von phpMyAdmin, wenn ich den String von Hand bastel)

      Timestamps => mag sein, dass sie nicht das Optimum darstellen, sie Funktionieren aber einwandfrei und der SQL String ist in seiner Funktion absolut korrekt.

      mysql_error => erledigt, Fehlermeldung siehe oben

      Warum sind offensichtlich gleichartige Daten in unterschiedlichen Tabellen gespeichert? Sieht nach einem weiteren Designfehler aus => hier handelt es sich nicht um gleiche Daten und es ist genau so geplant. Ich habe meine Datenbank soweit es möglich war normalisiert und die Struktur genau so geplant!

      Tabellennamen schlecht gewählt => sehe ich leider auch so....hoffe das es mit diesen Namen trotzdem gehen wird, da mir sonst viel Arbeit droht.

      Gruß
      Localhorst

      1. Hallo,

        Table 'usr_web262_2.16_96 Ma duenn' doesn't exist
        Es gibt sie aber.

        das nutzt Dir sehr viel, wenn MySQL sie nicht finden kann. Hast Du Groß- und Kleinschreibung beachtet?

        Wie bereits geschrieben funktioniert es auch auf dem Windows System. Und der andere Tabellenname mit einem Leerzeichen geht.

        Sondermüll in Tabellen- oder Spaltennamen geht, man muss diese halt kennzeichnen.

        Freundliche Grüße

        Vinzenz

        1. Unter dem von dir geposteten Link habe ich bereits geschaut, hat mir aber keine Lösung gebracht.

          Wo kann denn der Unterschied zwischen den folgenden beiden Strings liegen. Der erste ist mit phpMyAdmin generiert und funktioniert. Der Zweite kommt aus meinem Script und funktioniert auf dem Unix System nicht.

          Geht:
          SELECT DISTINCT ceil((TIMESTAMPDIFF(SECOND,NOW(),FROM_UNIXTIME( datum )))/86400*-1) AS days FROM 14\_94 MA duenn WHERE user_id =1 and status!=0

          Geht nicht:
          SELECT DISTINCT ceil((TIMESTAMPDIFF(SECOND,NOW(),FROM_UNIXTIME( datum )))/86400*-1) AS days FROM 14\_94 Ma duenn WHERE user_id =1 and status!=0

          1. Moin!

            Wo kann denn der Unterschied zwischen den folgenden beiden Strings liegen. Der erste ist mit phpMyAdmin generiert und funktioniert. Der Zweite kommt aus meinem Script und funktioniert auf dem Unix System nicht.

            Geht:
            SELECT DISTINCT ceil((TIMESTAMPDIFF(SECOND,NOW(),FROM_UNIXTIME( datum )))/86400*-1) AS days FROM 14\_94 MA duenn WHERE user_id =1 and status!=0

            Geht nicht:
            SELECT DISTINCT ceil((TIMESTAMPDIFF(SECOND,NOW(),FROM_UNIXTIME( datum )))/86400*-1) AS days FROM 14\_94 Ma duenn WHERE user_id =1 and status!=0

            Worin unterscheiden sich die beiden Strings? Gehe jedes Zeichen einzeln durch und liste bitte alle Unterschiede, die dir auffallen.

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
            1. Ahhhhhhh, jetzt schreibe ich es schon so untereinander und sehe es trotzdem nicht.....

              Danke!!!!

              Das war es.

              Jetzt kann ich meinen Sondermüll, die Sackhaare, Design Fehler und alle weiteren am Rand bemerkten "Lösung Vorschläge" doch ganz einfach korrigieren.

              Vielen Dank

          2. Hallo,

            Geht:
            SELECT DISTINCT ceil((TIMESTAMPDIFF(SECOND,NOW(),FROM_UNIXTIME( datum )))/86400*-1) AS days FROM 14\_94 MA duenn WHERE user_id =1 and status!=0

            Geht nicht:
            SELECT DISTINCT ceil((TIMESTAMPDIFF(SECOND,NOW(),FROM_UNIXTIME( datum )))/86400*-1) AS days FROM 14\_94 Ma duenn WHERE user_id =1 and status!=0

            Ja, das dachte ich mir doch.
            Wie schrieb ich vorhin:

            das nutzt Dir sehr viel, wenn MySQL sie nicht finden kann. Hast Du Groß- und Kleinschreibung beachtet?

            Freundliche Grüße

            Vinzenz

        2. Hallo,

          Table 'usr_web262_2.16_96 Ma duenn' doesn't exist
          Es gibt sie aber.

          das nutzt Dir sehr viel, wenn MySQL sie nicht finden kann. Hast Du Groß- und Kleinschreibung beachtet?

          ;) Das erinnert mich ein wenig an:

          Dame meldet sich beim Support:

          Dame:
          Mein PC sagt er kann keinen Drucker erkennen. Ich verstehe das nicht.

          Support:
          Haben Sie die richtigen Treiber installiert?

          Dame:
          Was für Treiber. Also mein Drucker steht genau neben dem PC! Ich erkenn ihn doch auch!