Snippets - Diskussionsthread

zu den mysql regeln... der insert set syntax gehört zwar nicht zum ansi standard ist aber eine nette sache, solang man nur mysql einsetzt. es ist bedeutent übersichtlicher

ebenso praktisches gegenbeispiel:

PHP:
$user = array();
$user['name'] = $_INPUT[name],
$user['vorname'] = $_INPUT[vorname],
$user['strasse'] = $_INPUT[strasse],
$user['ort'] = $_INPUT[ort],
$user['plz'] = $_INPUT[plz],
$user['land'] = $_INPUT[land],
$user['tel'] = $_INPUT[tel],
$user['tel2'] = $_INPUT[tel2],
$user['fax'] = $_INPUT[fax],
$user['vtyp'] = 234,
$user['ztyp'] = 345,
$user['added'] = time(),
$user['update'] = time(),
$user['ip'] = $user->IP,
$user['pwd_hash'] = MD5('$key$salt'),
$user['user_info_1'] = $info1,
$user['user_info_2'] = $info2,
$user['user_info_3'] = $info3,
$user['user_info_4'] = $info4


mysql_query("INSERT INTO daten (".join(",",array_keys($user)).") VALUES ('".join("','",array_values($user))."')" );

ich bin eine wandelnde mischung aus minimalist, perfektionist und klugscheisser. daraus ergibt sich, dass ich nur korrekte syntax verwenden möchte (zumindest versuch ich das) und das auch anderen gern beibringe. wenn man die datenbank aus welchem grund auch immer einmal umstellen will/muss, dann habe ich den vorteil, dass meine queries funktionieren. dein set aber nicht mehr.

auch bei mir kann man jederzeit felder entfernen oder hinzufügen etc...

wie gesagt: die korrekte syntax ist die beschriebene. dass die set-syntax manchmal einfacher und übersichtlicher sein kann, hab ich ja nicht bestritten :)
 
ich bin eine wandelnde mischung aus minimalist, perfektionist und klugscheisser. daraus ergibt sich, dass ich nur korrekte syntax verwenden möchte (zumindest versuch ich das) und das auch anderen gern beibringe. wenn man die datenbank aus welchem grund auch immer einmal umstellen will/muss, dann habe ich den vorteil, dass meine queries funktionieren. dein set aber nicht mehr.

entweder nutz ich die features die mir die datenbank bietet oder nicht... wäre ungefähr so wie wenn man orcale verwendet, aber man sich an ansi 92 hält. hat man viel gekonnt mit... nur weil vielleicht irgendwann mal ne andere datenbank fällig werden könnte.

btw: hast du eigentlich schon mal die datenbank gewechselt? vielleicht zb von mysql4 zu mssql? dann würdest du jetzt nicht solche behauptungen in den raum stellen das deine queries funktionieren würden...
 
entweder nutz ich die features die mir die datenbank bietet oder nicht...
naja feature ... ist ansichtssache, ob die abweichung vom standard immer gleich ein feature ist?

btw: hast du eigentlich schon mal die datenbank gewechselt?

websachen habe ich bislang nur einmal auf eine centura-db umsetzen müssen. so oft kommt das tatsächlich nicht vor. was aber für mich kein argument ist, sich nicht an sichere standards zu halten ... und zum thema mssql kann ich nicht viel sagen, da ich mich damit nicht auskenne. ich gehe aber mal davon aus, dass der standard-sql-wortschatz funktionieren sollte und demnach mein query es auch tun sollte. aber wie gesagt: nix ahnung von mssql.


aber ich möchte mich hier weder darüber streiten, noch weiter grossartig diskutieren. du hast deine meinung, ich meine. und wenn dir mein artikel in dieser art nicht passt, dann lösche ich ihn gern bevor du dich weiter daran stösst. ebenso wenig produktiv können wir uns auch über m$ und unix in die wolle bekommen und würden wahrscheinlich weder einen gemeinsamen nenner, noch ein ergebnis erzielen.
 
öhm, wo ist denn das problem? :LOL:
ActionScripter hat Code genannt der einfach anzupassen ist und der korrekten MySql (sogar SQL-92) Syntax entspricht und es ging doch gar net um Portierungen ?
wenn es Portabel sein soll, dann hilft doch eh nur ein SQL-Template-System (wobei ich da noch nie ein brauchbares gesehen habe). Denn auch MySQL kann SQL-96 (oder war es 2002?) nicht komplett, da Featureimplementierungen bei den Stored Procedures sowie Triggern fehlen (Trigger können keine Stored Procedures aufrufen)
 
Zum neuen Random-Signatur Snippet:

PHP:
ob_start(); 
readfile( sprintf($url,$_GET['id'],$_GET['aid']) ); 
$data = ob_get_contents(); 
ob_end_clean();
Aber doch um Himmelswillen nicht so 8O

Entweder, man benutzt file_get_contents() was allerdings weniger zu empfehlen ist, da kein Timeout setzbar, besser angebracht wäre da ganz eindeutig fsockopen() - mit Timeout!
Ein Workaround von tleilax ist imho auch in den Snippets oder im Archiv zu finden.
 
Zum neuen Random-Signatur Snippet:

PHP:
ob_start(); 
readfile( sprintf($url,$_GET['id'],$_GET['aid']) ); 
$data = ob_get_contents(); 
ob_end_clean();
Aber doch um Himmelswillen nicht so 8O

hatte vorher read_file ... meine binary safe version von tleilax's script drin und hab das nur aus lauter faulheit schnell so gemacht, damit der code nicht zu gross wird. hast aber recht, werd das mal ändern :)
 
Irgendwie passt der Webmasterlose-Müll ned wirklich, aber naja gut :-?

@ActionScripter:
Beim Posten im Snippets-Thread bitte die Signatur deaktiveren, dann muss ich das nicht immer nachträglich machen ;)

Zum Code selber:
  • $retry ist nicht definiert.
  • Du sendest einfach so mal den Header für ein GIF-Bild, prüfst aber nicht nach, ob Webmasterlose wirklich ein GIF-Bild liefert. Kriegst du ein PNG oder ein JPEG, wird der Browser das Bild als fehlerhaft interpretieren.
 
Beim Posten im Snippets-Thread bitte die Signatur deaktiveren, dann muss ich das nicht immer nachträglich machen ;)
wusst ich nicht, werds mir merken.

[*]$retry ist nicht definiert.
hast recht :)
[*]Du sendest einfach so mal den Header für ein GIF-Bild, prüfst aber nicht nach, ob Webmasterlose wirklich ein GIF-Bild liefert. Kriegst du ein PNG oder ein JPEG, wird der Browser das Bild als fehlerhaft interpretieren.
da hier immer mit gif gearbeitet wird ist das unproblematisch.

ich werde ab sofort natürlich nur noch fertige und 100%ig erprobte und durchdachte lösungen posten. ich habe wohl den begriff snippets falsch interpretiert :-?
 
https://www.klamm.de/forum/showpost.php?p=807270&postcount=15
nochmal ein wort zum thema LIMIT... sicherheit bringt das keine. wenn ein angreiffer es schaft aus
PHP:
DELETE * FROM user WHERE userID=123456
das zu machen
PHP:
DELETE * FROM user WHERE userID=123456 or userID>0

dann schaft er es genau sogut aus
PHP:
DELETE * FROM user WHERE userID=123456 LIMIT 1
das zu machen
PHP:
DELETE * FROM user WHERE userID=123456 or userID>0 /* LIMIT 1

*edit ist das forum ein bissel hirnrissig blöd... in dem letzten php tag steht eigentlich "DELETE * FROM user WHERE userID=123456 or userID>0 /* LIMIT 1"
 
Es geht um:
Sichere (MySQL)-Querys
ice-breaker (25. August 2006)

Ist es möglich das bei der Funktion die Übergabe von zu vielen Werten dann scheitert?

Sprich übergebe werte von ca 20-30 Spalten und dann wird mir irgendwas mit "vsprintf()" blabla gemeldet. ja.
desweiteren hab ich die SQL-Prozedere in einer while() schleife drin.

Also irgendwie find ich es merkwürdig. Es kam auch schon des öffteren vor das ich auch nur bis 5 werte hatte aber dennoch die fehlermeldung mit vsprintf() kam ...
ich wusste mir dann nicht anders zu helfen als ein normales MYSQL_QUERY() zu nehmen.

Weiß jemand rat?

Also ich übergebe die Variablen auch net so wie von ICE beschrieben: db_query('SELECT * FROM %s WHERE `%s`=%d','user','klammid',93995);


sondern so wie ein Standard ^^
db_query("INSERT INTO tab_user (klammid) VALUES ('86026')");


Sorry das ich das so schreibe aber bei 20-30 zu übergebenden Variablen komm ich durcheinanerr bei der oben genannten schreibweise ^^
 
Also ich übergebe die Variablen auch net so wie von ICE beschrieben: db_query('SELECT * FROM %s WHERE `%s`=%d','user','klammid',93995);

sondern so wie ein Standard ^^
db_query("INSERT INTO tab_user (klammid) VALUES ('86026')");

tja ich fürchte, dann hast du den sinn von db_query vollkommen missverstanden ... sechs, setzen!

der fehler kommt wahrscheinlich daher, dass du vsprintf durch deine falsche anwendung der methode ein leeres array als zweiten parameter übergibst.
 
Rofl ja anscheinend hab ich es falsch verstanden den ganzen SQL Injektion krimskrams ^^

Früher gab es sowas nicht.. da hab ich wie heute auch immer meine übergebenen Variablen ect. codiert ^^ und beim auslesen decodiert ^^

Heißt das wenn ich es nach vorgeschlagenere Methode machen tät dann würde keine fehler meldung kommen?

Falls ja dann versuch ich des einfach mal.. vielleicht komm ich ja tatsächlich noch irgendwann mal damit klar ^^
 
Ist es möglich das bei der Funktion die Übergabe von zu vielen Werten dann scheitert?

Sprich übergebe werte von ca 20-30 Spalten und dann wird mir irgendwas mit "vsprintf()" blabla gemeldet. ja.
desweiteren hab ich die SQL-Prozedere in einer while() schleife drin.

[...]


sondern so wie ein Standard ^^
db_query("INSERT INTO tab_user (klammid) VALUES ('86026')");


Sorry das ich das so schreibe aber bei 20-30 zu übergebenden Variablen komm ich durcheinanerr bei der oben genannten schreibweise ^^

da du dich auf insert beziehst würde ich mal sagen, dass du eine falsche Parameterzahl hast, ist mir auch schon manchmal passiert, nachzählen oder eine funktion bauen, die selbst einen insert-query erstellt ;)
 
Ach das betrifft ja nicht nur den Insert befehlt sondern update und select ebenfalls :)

Ich hab hier nen Programm welches Quelltexte parst und dort verschiedene Informationen (mehrfach) ausliest und in die DB schreibt bzw Aktuallisiert falls schon vorhanden.

Naja ich probiers einfach mal mit deiner vorgabe Ice.

Mit leer meinst Du sicherlich das eine variable nicht gesetzt ist bzw null ist.
 
Ich hab hier nen Programm welches Quelltexte parst und dort verschiedene Informationen (mehrfach) ausliest und in die DB schreibt bzw Aktuallisiert falls schon vorhanden.
also wenn du da tatsächlich bei jedem fund nen mysql-query absetzt und dann auch noch 20-30 parameter benötigt, dann möchte ich ungesehen behaupten, dass dein vorgehen und script mehr als optimierungsbedürftig ist ... vielleicht fragst du uns im programmierer-forum mal danach. hier gehts nur um die snippets selbst...
 
Das ist mir klar das es hier im die Snippets geht und um nichts anderes, aber ich hab auch nach nichts anderem gefragt :p

Ich fühl mich grad irgendwie beleidigt von Dir. Liegt wohl daran das Du keinen plan davon hast was ich mache bzw was für Variablen ich benötige. bzw ich aus dem Quelltext anderer auslese.
Ausgelesen wird das ganze aus einem quelltext der kann zwischen 500 - 1512Kb groß sein, welches die benötigten Informationen enthält. in jeder Zeile (<tr></tr>) einer Tabelle werden sowas wie ID, Name, Alter, Straße , Telefon, PLz, Ort, Geburtsort, große, gewicht ect. ausgelesen und jeweils einzeln nur der wert gespeichert.

Die o.g. angaben der werte "geburtsort" sind nicht die werte ich tatsächlich auslese sondern einfach andere aber was es genau ist tut net zur sache.
 
Ich fühl mich grad irgendwie beleidigt von Dir.
dann hast du mich wohl gründlich missverstanden ;)
ich wollte lediglich sagen, dass eine weitere diskussion, die sich dann vermutlich auf die optimierung deines codes bezieht nicht mehr hier geführt werden sollte.

Liegt wohl daran das Du keinen plan davon hast was ich mache bzw was für Variablen ich benötige. bzw ich aus dem Quelltext anderer auslese.
trotzdem ist das vorgehen, in einer schleife eine menge einzelner queries abzusetzen sicherlich wenig optimal. hierfür habe dir erfahrung und hilfe angeboten... aber du musst das es ja auch nicht annehmen...
 
Suche eins wo wenn ein MYSQL fehler auftritt, der den Fehler + Date in eine TXT speichert..