Tom: Warning: mysql_fetch_array(): supplied argument is not a ...

Beitrag lesen

Hello,

Hab jetzt die Zeile so abgeändert:
$sql = "SELECT * FROM '".$tablethreads."' WHERE id=".$tid;
Du meintest doch, dass die ' wegmüssen, oder?

Jetzt sieht die Variable $sql z. B. so aus:
SELECT * FROM 'ProjektWeltwunderThreads' WHERE id=5

Damit das hier nicht halbgar stehen bleibt, auch wenn pc-world inzwischen den fehler gefunden zu haben  scheint:

~~~php

$sql = "SELECT $columnlist FROM $tablethreads WHERE id=".intval($tid);

  
sollte nicht schädlich sein für MySQL.  
  
Anstelle von einfachen Hochkommata für den Tabellenbezeichner sind "Backticks" zu verwenden, wenn man die eben überhaupt setzen will (siehe übrige Diskussionen zum Thema in anderen aktuellen Threads).  
  
Und die \_numerische\_ ID, die irgendwie "von außen" kommt, auch als numerische Größe zu übergeben, ist positiv zu gunsten der Sicherheit. Dafür sollte dann aber die 0 als ID nicht zulässig, bzw. den "neutralen Wert" darstellen.  
  
Anderenfalls müsste man hier die vorgesehene Escape-Funktion verwenden (mysql\_real\_escape\_string()).  
  
Ich bin jetzt davon ausgegangen, dass der Tabellenname \_nicht\_ von außen geliefert wird!  
Und die Verwendung des \* für die Spaltenliste sollte auch unterbleiben, sondern stattdessen eine dedizierte Liste von Spaltennamen übergeben werden, die ihrerseits dann wieder  
  
  
  ~~~php
  
  
  $columnlist = "`vorname`, `nachname`, `plz`, `index`";  
  
  

lauten könnte...
Ich habe hier absichtlich eine Spalte (index) mit einem reservierten Wort benutzt, da MySQL dies nun einmal erlaubt und ich daher der Meinung bin, dass man genau deshalb auch die Backticks _immer_ einsetzen sollte.

Wenn man ein richtiges[tm] DBMS benutzt, kann oder muss man das ja dann sowieso unterlassen.

Ein harzliches Glückauf

Tom vom Berg

--
Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de