Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
30.11.2005, 12:10
Tubgirl



Mich interessiert der Unterschied zwischen

Quellcode:UPDATE cms3_nodes SET script='text.php' WHERE id='1' und
Quellcode:UPDATE cms3_nodes SET script='text.php' WHERE id='1' Das mag auf den ersten Blick identisch aussehen, ist's aber nicht. Denn Nummer 1 funktioniert, während Nummer 2 das Feld "script" leert statt "text.php" reinzuschreiben.

Dabei setzen sich die beiden so zusammen:

Quellcode://Funktioniert
"UPDATE ".$db->prefix."nodes SET script='".$_POST['path']."' WHERE id='".$_REQUEST['node']."'"
Quellcode://Funktioniert nicht
"UPDATE ".$db->prefix."nodes SET script='text.php' WHERE id='".$_REQUEST['node']."'"
Wenn es umgekehrt wäre, dann würde ich das ja noch verstehen. Hieße dann, dass mein $_POST['path'] (mit dem Inhalt "text.php") nicht richtig übergeben würde. Komischerweise macht aber gerade der Query, der ausdrücklich sagt, dass "script" auf "text.php" zu setzen ist nicht was er soll.

Ich bin mit meinem Latein am Ende und setze nun alle Hoffnung auf euch. Hier noch die Struktur meiner Tabelle:

Quellcode:CREATE TABLE `cms3_nodes` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `home` int(11) unsigned NOT NULL default '0',
  `title` varchar(64) NOT NULL default '',
  `script` varchar(128) NOT NULL default '',
  `position` int(3) NOT NULL default '0',
  `hidden` tinyint(1) NOT NULL default '0',
  `public` tinyint(1) NOT NULL default '0',
  `intern` tinyint(1) NOT NULL default '0',
  `uniaccess` tinyint(1) NOT NULL default '0',
  `nodelete` tinyint(1) NOT NULL default '0',
  `noedit` tinyint(1) NOT NULL default '0',
  `adminscript` tinyint(1) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM COMMENT='Inhalts-Baum' AUTO_INCREMENT=17 ;
Und hier mein Script: http://www.rafb.net/paste/results/3Vcprt80.html

Die Problemquerys sind in Zeile 75 (funktioniert) und Zeile 114 (funktioniert nicht).

Bestimmt ist das irgendwas offensichtliches, was ich seit mehreren Tagen andauernd übersehe D:

--


Dieser Beitrag wurde am 30.11.2005 um 12:11 von -Sir_Pepe- bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
02.12.2005, 11:25
Tubgirl



Da dieses Nopaste-Teil jetzt tot ist, hier nochmal der Code: http://www.planet-pepe.net/stuff/script.txt

--

zum Seitenanfang zum Seitenende Profil || Suche
002
02.12.2005, 11:49
WareWolf



dieser *PUSH* hat Stil Pepe ;)

--

Sig as a brick ┴┬┴┬┴┬┴┬┴┬┴┬┴
WW

zum Seitenanfang zum Seitenende Profil || Suche
003
13.12.2005, 13:36
Tubgirl



Hat denn wirklich niemand eine Idee?

--

zum Seitenanfang zum Seitenende Profil || Suche
004
13.12.2005, 15:56
K-Putt



Hab ne Zeit lang herum probiert, aber bin leider auch ratlos.

Das einzige, was mir einfällt, und selbst schon mal passiert ist: Ein Feld in deiner Tabelle, dass den selben Namen wie ein MySQL-Ausdruck hat, und die DB nicht weiß, ob es der Feldname oder der ein Befehl ist.

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database

zum Seitenanfang zum Seitenende Profil || Suche
005
13.12.2005, 16:27
HammerBlade



Du kannst das ja mal so zu beheben versuchen:

Quellcode:$dummy = "text.php";
"UPDATE ".$db->prefix."nodes SET script='".$dummy."' WHERE id='".$_REQUEST['node']."'"
Würde mich zwar wundern wenn's dann geht, aber Probieren geht über Studieren.

--

"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon
Auspack und freu! - Auszug aus einer, aus dem japanischen übersetzten, Bedienugsanleitung für ein Spielzeugaquarium.
--
Photon Audio Player | Majestic42.net | How To Ask Questions The Smart Way

zum Seitenanfang zum Seitenende Profil || Suche
006
13.12.2005, 17:33
Tubgirl



Antworten weee \o/

Zitat:
Das einzige, was mir einfällt, und selbst schon mal passiert ist: Ein Feld in deiner Tabelle, dass den selben Namen wie ein MySQL-Ausdruck hat, und die DB nicht weiß, ob es der Feldname oder der ein Befehl ist.
Müsste's dann nicht eine Fehlermeldung ausspucken statt "true" zurückzugeben?

Zitat:
Du kannst das ja mal so zu beheben versuchen:
Probiert, klappt aber leider nicht.

--

zum Seitenanfang zum Seitenende Profil || Suche
007
13.12.2005, 18:28
HammerBlade



Hast du es schon auf einem anderen SQL-Server probiert? Hast du die beiden Queries nur im Kontext des gepasteten PHP-Scripts getestet oder auch mal in einem eigenen Testscript? Sind die beiden Queries auch auf Byteebene identisch, soll heissen liegt da vielleicht ein Textcodecproblem vor (unwahrscheinlich, vielleicht auch unmöglich, aber irgendwo muss es ja dran liegen)?

Edit: Falschrum gedacht.

--

"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon
Auspack und freu! - Auszug aus einer, aus dem japanischen übersetzten, Bedienugsanleitung für ein Spielzeugaquarium.
--
Photon Audio Player | Majestic42.net | How To Ask Questions The Smart Way


Dieser Beitrag wurde am 13.12.2005 um 18:30 von HammerBlade bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
13.12.2005, 19:05
Jim Panse



mal den inhalt von $_REQUEST['node'] ausgeben lassen?
übrigens: da das feld `id` bei dir ein int(11) ist würde ich die einfachen anführungszeichen in der where-klausel weglassen! das macht zwar meist keinen unterschied, aber in dem moment wo du diese verwendest führt mysql intern einen typecast durch, da anführungszeichen nur string umschliessen dürfen. u.u. könnte da mit deiner id sonstwas passieren...

das sind die einzigen beiden dinge die mir so auffallen, ohne die anwendung im ganzen zu sehen.

du kannst dir auch mal prophylaktisch nach jedem query den inhalt von mysql_error() und/oder mysql_warning() ausgeben lassen nur um sicherzustellen, das nicht was mit dem query schiefläuft...

--

zum Seitenanfang zum Seitenende Profil || Suche
009
13.12.2005, 19:54
McScore



Schon mal ganz banal mit ... `script`=\'text.php\' ... versucht?

--

... und der große böse Wolf bootete und bootete und bootete ...
Optimiere deine Map, sieh dir alle Compile-Errors an, frage den Hersteller und beschwer dich über nichts!
http://www.mcscore.de.vu
13+3+7=23, 133/7+23=42

zum Seitenanfang zum Seitenende Profil || Suche
010
13.12.2005, 20:26
K-Putt



Zitat:
McScore postete
Schon mal ganz banal mit ... `script`=\'text.php\' ... versucht?
Würde nur einen SQL Fehler ergeben, weil die Backslashes dann im Query auftauchen.

Merke: Wird ein String von "" umgeben, braucht man die ' ' im String drin nicht escapen.

--

Rambo Engineer @ Drippy's 2fort - finest TFC 1.5 || Bild Upload || The world's most advanced open source database

zum Seitenanfang zum Seitenende Profil || Suche
011
14.12.2005, 09:39
Zpin



Kannst du das Problem anders rekonstruieren? ZB nen 3 Zeiler schreiben, der jeder bei sich ausführen kann... Würde bei der Fehlersuche sicher helfen. Evtl. ists ja ein PHP Bug, und dein Server sollte mal updaten.

--

zum Seitenanfang zum Seitenende Profil || Suche
012
14.12.2005, 10:29
oxff



Zitat:
Jim Panse postete
übrigens: da das feld `id` bei dir ein int(11) ist würde ich die einfachen anführungszeichen in der where-klausel weglassen! das macht zwar meist keinen unterschied, aber in dem moment wo du diese verwendest führt mysql intern einen typecast durch, da anführungszeichen nur string umschliessen dürfen. u.u. könnte da mit deiner id sonstwas passieren..
Ja, es lebe die SQL Injection! Wenn wenigstens dann einen PHP Typecast:

Quellcode:$qry = $qry_prefix . ((int) $user_supplied_integer) . $qry_suffix

--

mwcollect - mein Projekt | oxlog - mein blog | happyhardcore.com Stream - gute Musik

zum Seitenanfang zum Seitenende Profil || Suche
013
16.12.2005, 18:54
McScore



Zitat:
K-Putt postete
Merke: Wird ein String von "" umgeben, braucht man die ' ' im String drin nicht escapen.
Nahrg... bin ich mal wieder geistig noch abwesender gewesen als sonst.

--

... und der große böse Wolf bootete und bootete und bootete ...
Optimiere deine Map, sieh dir alle Compile-Errors an, frage den Hersteller und beschwer dich über nichts!
http://www.mcscore.de.vu
13+3+7=23, 133/7+23=42

zum Seitenanfang zum Seitenende Profil || Suche
014
17.12.2005, 15:08
Tubgirl



Zitat:
Hast du es schon auf einem anderen SQL-Server probiert? Hast du die beiden Queries nur im Kontext des gepasteten PHP-Scripts getestet oder auch mal in einem eigenen Testscript?
Auf insgesamt drei Servern das gleich Ergebnis... query wird nicht ausgeführt, die If-Abfrage spuckt aber true aus. Das Interessante: mit einem Testscript klappt's.
PHP-Quellcode:<?php
  
  
/////////////////////////
  // Test                //
  /////////////////////////

  
global $tpl;
  global 
$db;
  
  if(
$db->query("UPDATE ".$db->prefix."nodes SET script='text.php' WHERE id='".$_REQUEST['node']."'"))
  {
    
//Text erstellen
    
$db->query("INSERT INTO ".$db->prefix."textpage (node) VALUES ('1')");
    print 
"Klappt!";
  }
  else
  {
    
//Output
    
print "Klappt nicht!";
  }
  
?>
Gibt "Klappt" aus, ändert das Feld "script" in der "nodes"-Tabelle und alles ist so wie's sein sollte. Die Frage ist nur, warum das im großen Script nicht will.

Zitat:
Vorschläge von Jim Panse
$_REQUEST['node'] ist eine Zahl und wird auch korrekt übergeben - daran liegt's also nicht. An den Anführungszeichen herumzuspielen hat auch nichts geändert.
Das perverse ist ja, dass das Script davon überzeugt ist alles richtig zu machen. If gibt true zurück und MySQL-Fehler gibt's auch keine:
Quellcode:SQL[55]: mysql_errno: 0
Query: UPDATE cms3_nodes SET script='text.php' WHERE id='1'

SQL[56]: mysql_errno: 0
Query: INSERT INTO cms3_textpage (node) VALUES ('1')
Verbleiben wir ratlos.

Zur Not könnte ich diese Aufgabe ja erledigen, indem ich den alten Datensatz entferne und einen neuen, bei dem dann "script" anders ist mit INSERT wieder einfüge. Das wäre zwar... doof, würde aber laufen.
Eine richtige Lösung ist dem natürlich vorzuziehen.

--


Dieser Beitrag wurde am 17.12.2005 um 15:15 von -Sir_Pepe- bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
015
17.12.2005, 15:22
TheTinySteini



Hm... schonmal probiert die Zeile rauszuloeschen und neu zu schreiben? Eventuell hast du aus $grund nen dummes Sonderzeichen drin, was dir alles kaputt macht *shrugs*

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
016
17.12.2005, 15:48
Tubgirl



Natürlich, mehrfach.
Jetzt mal was groteskes: Auch der oben angesprochene Delete-dann-neu-Insert-Workaround klappt nicht.

PHP-Quellcode:<?php
            
//Den kompletten betroffenen Datensatz auslesen
            
$db->query("SELECT * FROM ".$db->prefix."nodes WHERE id='".$_REQUEST['node']."' LIMIT 1");
            
$save $db->fetch_array();
            
//Den betroffenen Datensatz killen...
            
$db->query("DELETE FROM ".$db->prefix."nodes WHERE id='".$_REQUEST['node']."' LIMIT 1");
            
//...und wieder neu einfuegen
            
if($db->query("INSERT INTO ".$db->prefix."nodes
            (id, home, title, script, position, hidden, public, intern ,uniaccess, nodelete, noedit, adminscript) VALUES
            ("
.$save['id'].", ".$save['home'].", '".$save['title']."', 'text.php', ".$save['position'].", ".$save['hidden'].", ".$save['public'].", ".$save['intern'].", ".$save['uniaccess'].", ".$save['nodelete'].", ".$save['noedit'].", ".$save['adminscript'].")"))
?>
Das Feld "script" bleibt auch beim Insert leer, statt dass da text.php reinkommt.

*edit*
Das Problem scheint der Ausdruck "text.php" zu sein, denn wenn ich da "anus.php" o.Ä. einfügen lasse, dann klappt das. Nur warum lässt sich text.php einfügen wenn's als $_POST['script'] aus einem Formular kommt?

*edit2*
Stimmt alles nicht

Wie ich es auch drehe und wende, es passiert nicht das was ich will. Weder richtig, noch mit diesem Delete-Insert-Teil. Das Feld "script" bleibt leer wenn ich etwas via Script fest reinschreiben will.

--


Dieser Beitrag wurde am 17.12.2005 um 16:12 von -Sir_Pepe- bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
017
17.12.2005, 19:03
Jim Panse



ok, weiterer tag, weiterer test:

lass dir mal an der stelle wo du den query ausführst, den query ausgeben. also etwa so:

PHP-Quellcode:<?php
echo $que =  "UPDATE ".$db->prefix."nodes SET script='text.php' WHERE id='".$_REQUEST['node']."'";
$db->query($que);
?>
nimm den query und führe ihn z.b. mit phpmyadmin oder mysqlcc an derselben datenbank durch und guck was da passiert. bleibt auch da das feld leer, liegts am query/der datenbank. wird das feld da korrekt ausgefüllt liegts u.U. an deiner query-klasse, die du da verwendest. in dem falle würde ich mir mal anschauen, was diese klasse der reihe nach mit deinem query macht, bevor dieses an die datenbank geschickt wird.

so long

--


Dieser Beitrag wurde am 17.12.2005 um 19:03 von Jim Panse bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
018
17.12.2005, 20:01
Tubgirl



Wenn ich den ausgebenen Query in Phpmyadmin einfüge fluppt alles wie es soll. Die MySQL-Klasse (die nicht mein Werk ist) verweden wir seit anbeginn der Zeiten... die hat noch nie irgendwelche Probleme gemacht und ist nichts wirklich besonderes. Das hier ist die Query-Funktion:

PHP-Quellcode:<?php
  
function query($query_string$res=0)
  {
    
$this->query_string $query_string;
    
$this->result[$res] = mysql_query($query_string,$this->conn);
    
$this->debug_handle();
    return 
$this->result[$res];
  }
?>
Sieht für meine Amatuer-Augen ganz normal aus...

*edit*
Wenn's daran liegt, dann reiß ich dem Erschaffer die Eier ab :D

*edit2*
Die ganze Klasse, wenn's hilft: http://rafb.net/paste/results/ujjpAY86.html

--


Dieser Beitrag wurde am 17.12.2005 um 20:04 von -Sir_Pepe- bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
019
20.12.2005, 11:49
Tubgirl



So, ich hab denn mal weitergemacht. Ich hab die einzelnen case-break-Blöcke aus dem obrigen Script der übersichtlichkeit halber mal in einzelne Dateien aufgeteilt. Außerdem habe ich alle Scripts etwas umgebaut, so dass jetzt nicht mehr ein Varchar 'script' behandelt wird, sondern ein Tinyint 'type'. Das Resultat ist das gleiche, aber wesentlich übersichtlicher.

PHP-Quellcode:<?php
  
//Daten holen - geht's um Text-zu-Script oder Script-zu-Text?
  
$db->query("SELECT title, type FROM ".$db->prefix."nodes WHERE id='".$_REQUEST['node']."'");
  
$node $db->fetch_array();
  if(
$node['type'] == 1)
  {
    
//Text zu Script
    
if($db->query("UPDATE ".$db->prefix."nodes SET type=0 WHERE id='".$_REQUEST['node']."'"))
    {
      
//Eventuell vorhandenen Text loeschen
      
$db->query("DELETE FROM ".$db->prefix."textpage WHERE node='".$_REQUEST['node']."'");
      
//Output
      
$tpl->display('scripts/content_script.tpl.php'); 
    }
    else
    {
      
//Gallery
      
$tpl->assign('gallery'get_gallery());
      
$tpl->display('scripts/content_text.tpl.php'); 
    }
  }
  else
  {
    
//Script zu Text
    
if($db->query("UPDATE ".$db->prefix."nodes SET type=1 WHERE id='".$_REQUEST['node']."'"))
    {
      
//Text erstellen
      
$db->query("INSERT INTO ".$db->prefix."textpage (node) VALUES ('".$_REQUEST['node']."')");
      
//Gallery
      
$tpl->assign('gallery'get_gallery());
      
//Output
      
$tpl->display('scripts/content_text.tpl.php'); 
    }
    else
    {
      
//Output
      
$tpl->display('scripts/content_script.tpl.php'); 
    }
  }
?>
Dieser Query funktioniert:
Quellcode:"UPDATE ".$db->prefix."nodes SET type=1 WHERE id='".$_REQUEST['node']."'" Dieser nicht:Quellcode:"UPDATE ".$db->prefix."nodes SET type=0 WHERE id='".$_REQUEST['node']."'" So langsam gehen mir die Ideen aus.

Beide geben true zurück und alles was in der IF-Anfrage steht wird auch brav ausgeführt. Nur eben bekommt die Datenbank das Update des zweiten Query nicht mit.

Hier mal der Output des Debuggers für den streikenden Query:

Zitat:
SQL[55]: mysql_errno: 0
Query: UPDATE cms3_nodes SET type=1 WHERE id='1'

SQL[56]: mysql_errno: 0
Query: INSERT INTO cms3_textpage (node) VALUES ('1')

--


Dieser Beitrag wurde am 20.12.2005 um 11:52 von -Sir_Pepe- bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
020
20.12.2005, 12:18
Kriz



Zitat:
Auszug aus der MySQL Ref über mysql_errno:
...Ein Rückgabewert von 0 bedeutet, dass kein Fehler auftrat...
Zumindest ist der Query korrekt, kann also nur semantischer Natur sein...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)


Dieser Beitrag wurde am 20.12.2005 um 12:18 von Kriz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
021
20.12.2005, 14:56
hausi



Benenn die Spalte "type" mal um. Es könnte ev. sein, dass TYPE auch nach dem erstellen noch für den Tabellen Typ (MyISAM, etc.) zuständig ist und deshalb Queries mit einem gleichnamigen Feld ein bisschen ein komisches Verhalten zeigen.

--

zum Seitenanfang zum Seitenende Profil || Suche
022
20.12.2005, 23:01
Alcapone



Gib mal dein query mit echo aus oder speicher es in einer variable ab und gibs dann aus (ohne funktion). Da siehste ob alle werte drinnen stehen. Wenn nicht, dann liegt der Fehler ned am query.

--

"Everything, that can go wrong, will go wrong" Murphy's Law

zum Seitenanfang zum Seitenende Profil || Suche
023
21.12.2005, 10:45
TheTinySteini



Die Anmerkung von Superhausi koennte stimmen, wuerde mich zwar sehr wundern warum es dann mit type=1 geht und mit type=0 nicht, aber naja...
Escape doch mal probeweise die Spaltennamen in deinem Query, also `type`=1.

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
024
21.12.2005, 11:00
hausi



Zitat:
TheTinySteini postete
Die Anmerkung von Superhausi koennte stimmen, wuerde mich zwar sehr wundern warum es dann mit type=1 geht und mit type=0 nicht, aber naja...
Escape doch mal probeweise die Spaltennamen in deinem Query, also `type`=1.
Auch dafür hätte ich ev. eine Erklärung... Die Typen haben ev. intern einen Index, der von 1 an aufwärts geht... Da kann das schon sein, dass bei 0 der Query einfach nix macht und mit 1 (was warscheinlich MyISAM entspricht) etwas macht...
Edit:
Das mit dem escapen ist natürlich eine einfachere Lösung. Ich würde aber, wenn das wirklich das Problem ist, die Spalte trotzdem umbenennen... Dann passiert dir das sicher nicht mehr.

--


Dieser Beitrag wurde am 21.12.2005 um 11:01 von Superhausi bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche