php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 28-08-2006, 20:51
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard mysql null vs. php null

hi leute,

wie schon im betreff geschrieben unterscheiden sich ja die null-werte.
ich wollte mal eine kleine session-verwaltung auf die beine stellen. hier die datenbanktabelle dazu:
Code:
CREATE TABLE `user_session` (
  `session_id` varchar(32) NOT NULL default '',
  `account_name` varchar(20) default NULL,
  `last_timestamp` varchar(10) NOT NULL default '',
  `session_data` text NOT NULL,
  PRIMARY KEY  (`session_id`),
  UNIQUE KEY `account_name` (`account_name`)
)
nicht angemeldete benutzer bekommen in der dazugehörigen php-klasse den wert null: private $account_name=null;

mein insert, wenn eine neue session gestartet wird, sieht dazu so aus:
PHP-Code:
$sql="INSERT INTO `user_session` 
(`session_id`, `account_name`, `last_timestamp`, `session_data`)
VALUES
('"
.session_id()."', '$this->account_name',  '".time()."', '".serialize($this->data)."')"
tja, $this->account_name ist php-null, aber mysql versucht einen leeren string einzutragen: "Duplicate entry '' for key 2"

wie bekomme ich nun php-null als mysql-null in die datenbank?
Mit Zitat antworten
  #2 (permalink)  
Alt 28-08-2006, 21:02
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

du behandelst $this->account_name in mysql als string.

so sollte es passen ....

PHP-Code:
$sql "INSERT INTO `user_session` 
    (`session_id`, `account_name`, `last_timestamp`, `session_data`)
VALUES
    ('"
.session_id()."',
     "
.(isnull($this->account_name
            ? 
"NULL"
            
"'".mysql_real_escape_string($this->account_name)."'").",
     '"
.time()."',
     '"
.serialize($this->data)."')"
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #3 (permalink)  
Alt 28-08-2006, 21:35
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

danke, funktioniert (mit is_null)

ich habe jetzt aber noch ein grundlegendes verständnisproblem.

in php ist null nichts und 'null' bzw. "null" ein string.
wie kann ich mir das in mysql vorstellen? gibt es dort auch diesen unterschied?
ansonsten könnte ja account_name nicht 'NULL' (als string) sein.
Mit Zitat antworten
  #4 (permalink)  
Alt 28-08-2006, 21:37
gleiwitz19
 Banned
Links : Onlinestatus : gleiwitz19 ist offline
Registriert seit: Jul 2006
Ort: Banned by wahsaga
Beiträge: 76
gleiwitz19 ist zur Zeit noch ein unbeschriebenes Blatt
Standard Re: mysql null vs. php null

Zitat:
wie bekomme ich nun php-null als mysql-null in die datenbank?
Indem Du zuerst 'von Hand' eine php-null in ein sql-NULL (ohne apostrophe) übersetzt.
Beim späteren Abfragen bekommst Du aber automatisch eine php-Null zurückgeliefert,
weil mysql_fetch_xxx das automatisch macht.

Du könntest auch mysql_real_escape_string(php-null) versuchen?? ich denke es geht nicht.
Mit Zitat antworten
  #5 (permalink)  
Alt 28-08-2006, 21:51
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

@3DMax
ich habe an mysql ja auch nur NULL gegeben. nicht als string. die " sind nur die string-teile für den php string zur überhabe an mysql.

und is_null() ist korrekt. vertue mich da immer ob _ oder nicht. in mysql ist's nämlich genau anders, wenn nicht irre. ISNULL(), IFNULL(), usw. ....
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #6 (permalink)  
Alt 28-08-2006, 21:55
gleiwitz19
 Banned
Links : Onlinestatus : gleiwitz19 ist offline
Registriert seit: Jul 2006
Ort: Banned by wahsaga
Beiträge: 76
gleiwitz19 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von 3DMax
danke, funktioniert (mit is_null)

ich habe jetzt aber noch ein grundlegendes verständnisproblem.

ansonsten könnte ja account_name nicht 'NULL' (als string) sein.
indem du echo $sql machst. Dann siehst Du, dass im $sql-String NULL vorkommt,
nicht 'NULL' oder "NULL".
Mit Zitat antworten
  #7 (permalink)  
Alt 28-08-2006, 22:47
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

danke euch beiden, im übersetzten sql-query erscheint tatsächlich nur NULL ohne ' oder ".

meine erkennnis daraus: innerhalb von sql werden zeichenketten in ' eingeschlossen. kann man das so zusammenfassen?
Mit Zitat antworten
  #8 (permalink)  
Alt 29-08-2006, 10:03
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

oder auch " das ist dir überlassen.
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #9 (permalink)  
Alt 31-08-2006, 20:39
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ich greife diesen thread einfach nochmal auf.

der hinweis mit mysql_real_escape_string() hat mich jetzt ein wenig nachdenklich gemacht.
Zitat:
serialize($this->data)
ist das array, wo später mal alle zur session gehörigen daten reinkommen. vielleicht user_agent usw.

dort müsste ich doch auch mysql_real_escape_string() anwenden oder?
oder anders gefragt, sollte grundsätzlich auf alle strings diese funktion als präventivschutz angewandt werden?
Mit Zitat antworten
  #10 (permalink)  
Alt 31-08-2006, 20:58
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
sollte grundsätzlich [...] angewandt werden?
JA
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #11 (permalink)  
Alt 31-08-2006, 21:14
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Abraxax
JA
das war deutlich

jetzt mal noch eine naive frage. ich habe mir gerade eine db-klasse geschrieben, mit der methode public function query($sql).
macht es sinn, dort zentral mysql_real_escape_string() grundsätzlich auf das komplette $sql auszuführen?

[edit]
habe gerade selbst festgestellt und getestet, dass das blödsinn ist.
aber könnte man das anders innerhalb der methode realisieren? da brächte man soetwas wie einen "sql-parser".

Geändert von 3DMax (31-08-2006 um 21:20 Uhr)
Mit Zitat antworten
  #12 (permalink)  
Alt 31-08-2006, 22:07
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

erstelle eine methode escape() oder was auch immer. diese methode braust du dann in deinem normalen query-string ein, wenn du diesen an die class weiter reichst.

PHP-Code:
function escape($_string) {
    return 
mysql_real_escape_string($_string);

PHP-Code:
$sql 'SELECT feld1 FROM tabelle WHERE feld1 = "'.$db->escape('hhhh').'"' 

du die escape() methode in der class hast du die möglichkeit später z.b. von mysql auf ein anderes db-system zu wechseln. z.b. postgres etc.

hier baust du dir dann eine PG class und verwendest in der methode escape() dann die entsprechende postgres funktion zum escapen der daten.



aber mal an rande ... das sind doch alles grundlagen.....
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #13 (permalink)  
Alt 01-09-2006, 08:59
closure
 Master
Links : Onlinestatus : closure ist offline
Registriert seit: Mar 2006
Beiträge: 796
closure ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von 3DMax
[edit]
habe gerade selbst festgestellt und getestet, dass das blödsinn ist.
aber könnte man das anders innerhalb der methode realisieren? da brächte man soetwas wie einen "sql-parser".
Ok du hast also rausgefunden dass dann auch sache escaped werden,
die gar nicht escaped werden sollten.

Du könntest dir überlegen eine etwas andere query implementierung
zu wählen. Eine die platzhalter unterstützt. Dann kannst du auch
wieder automatische escapen.

Die declaration könnte folgendermaßen aussehen:

PHP-Code:

//query(string,parameter1,parameter2,...)
public function query(){
     
//ein bisschen magie mit func_num_args/func_get_args

Ein query würde dann meinetwegen so aussehen:
PHP-Code:
$db->query("SELECT * FROM `tablex` WHERE `id` = ?",3); 
Die funktion query iteriert über die argumente nach dem
querystring und escaped sie. Dann werden die platzhalter im
querystring durch die maskierten argumente ersetzt. Und schon
bist du wieder auf der sicheren seite und der clientprogrammierer
kann nicht vergessen $db->escape() zu verwenden, weil du
es jetzt automatisch machst.

greets
__________________
(((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")
Mit Zitat antworten
  #14 (permalink)  
Alt 01-09-2006, 22:22
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

werde wohl den vorschlag von Abraxax übernehmen.
bei adodb ist es auch so gelöst.

@closure
auch eine gute idee, macht nur das sql im quelltext etwas unleserlich.
hab auch schon überlegt, direkt im sql delimiter um die zu escapenden teile zu setzen und dann mit preg_replace_callback zu ersetzen, dann dürfen aber wieder die delimiter nicht im string selbst vorkommen.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 05:56 Uhr.