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 25-05-2009, 23:01
JimmDaBimm
 Registrierter Benutzer
Links : Onlinestatus : JimmDaBimm ist offline
Registriert seit: Jun 2007
Beiträge: 53
JimmDaBimm ist zur Zeit noch ein unbeschriebenes Blatt
Standard Merkwürdiges Verhalten von MySQL!?

Moin,

ersteinmal möcht ich mich für die warscheinlich missglückte Überschrift entschuldigen. Mir ist allerdings nichts kurzes und knappes eingefallen, was mein "Problem" trifft.

Irgendwie ist mir erst heute ein merkwürdiges Verhalten von MySQL aufgefallen. Undzwar geht es um folgenen Query:

Code:
SELECT Subject FROM post WHERE ID = '1asfgh'
Der Eintrag mit der ID 1 wird dennoch gefunden. Ich kann da sonst was reinschreiben... sobald die ersten Stellen übereinstimmen(funktioniert auch mit mehrstelligen Eingaben) ist MySQL der Meinung, dass die IDs übereinstimmen. Gibt es eine Möglichkeit, genau nach dem gesuchten Wert zu suchen?

Ist dieses Verhalten normal? Ich mein... ich 'arbeite' jetzt schon ewig lange mit MySQL und irgendwie ist mir das noch nie aufgefallen.
Mit Zitat antworten
  #2 (permalink)  
Alt 25-05-2009, 23:06
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Kann ich nicht nachvollziehen.

CREATE-Table-Statement ist...?
Mit Zitat antworten
  #3 (permalink)  
Alt 25-05-2009, 23:11
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

"Vermutlich" ist ID ein nummerisches Feld und MySQL holt aus dem alpha-nummerischen Value den nummerischen Anteil und nutzt ihn weiter.

Weiterhin gilt natürlich, was ghostgambler gefordert hat ...
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #4 (permalink)  
Alt 25-05-2009, 23:16
JimmDaBimm
 Registrierter Benutzer
Links : Onlinestatus : JimmDaBimm ist offline
Registriert seit: Jun 2007
Beiträge: 53
JimmDaBimm ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Sieht wie folgt aus:

Code:
CREATE TABLE `post` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `User_ID` int(11) NOT NULL,
  `Date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `Subject` varchar(255) NOT NULL,
  `Text` text NOT NULL,
  `Tags` text NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
Mit Zitat antworten
  #5 (permalink)  
Alt 25-05-2009, 23:27
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

Ich habe das Verhalten bei mir getestet. Wenn eine ID-Spalte vom Typ INT - oder ein anderer Zahlentyp - ist, werden in deinem Fall der Query beim Value die nummerischen Werte - wenn sie am Anfang stehen - genutzt und der Rest abgeschnitten.

Wenn dein Value 'asd1asfgh' ist, findest du keine Ergebnisse mit Id=1
__________________
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 25-05-2009, 23:33
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von JimmDaBimm Beitrag anzeigen
Code:
SELECT Subject FROM post WHERE ID = '1asfgh'
Der Eintrag mit der ID 1 wird dennoch gefunden. Ich kann da sonst was reinschreiben...
Das ist das normale Casting-Verhalten bei der Umwandlung von Strings in nummerische Werte; in PHP ist es ganz analog.

Du kannst bspw. BINARY benutzen, um die ID ebenfalls in einen String zu casten - SELECT BINARY 1 = '1xyz' liefert 0, also false.

Ob das der optimalste Weg ist, darüber kann man ggf. streiten. Du könntest ja auch vorher schon dafür sorgen, dass nur nummerische bzw. INT-Werte in der Query landen.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #7 (permalink)  
Alt 25-05-2009, 23:53
JimmDaBimm
 Registrierter Benutzer
Links : Onlinestatus : JimmDaBimm ist offline
Registriert seit: Jun 2007
Beiträge: 53
JimmDaBimm ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Vielen Dank für die hilfreichen Antworten. Selbstverständlich sorge ich schon im Script dafür, dass nur numerische Werte im Query ankommen. Das lässt sich mit PHP ja glücklicher Weise recht gut lösen. Mir ging es in erster Linie auch nur um das Verhalten an sich.
Mit Zitat antworten
  #8 (permalink)  
Alt 26-05-2009, 00:02
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Das Verhalten ist unter PHP genauso:

PHP-Code:
var_dump(== '1asfgh');
// bool(true) 
PHP und MySQL haben ein automatisches Type-Casting.
Mit Zitat antworten
  #9 (permalink)  
Alt 26-05-2009, 00:18
JimmDaBimm
 Registrierter Benutzer
Links : Onlinestatus : JimmDaBimm ist offline
Registriert seit: Jun 2007
Beiträge: 53
JimmDaBimm ist zur Zeit noch ein unbeschriebenes Blatt
Standard

naja, ich prüfe jetzt einfach mit ctype_digit() ob nur Ziffern enthalten sind und dann past das schon .
Mit Zitat antworten
  #10 (permalink)  
Alt 26-05-2009, 00:30
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Dann mach dir auch schon mal über negative Integerwerte und Doublewerte allgemein Gedanken.
Mit Zitat antworten
  #11 (permalink)  
Alt 26-05-2009, 00:56
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von JimmDaBimm Beitrag anzeigen
naja, ich prüfe jetzt einfach mit ctype_digit() ob nur Ziffern enthalten sind und dann past das schon .
Ein reiner Cast auf Integer reicht in den meisten Fällen. Was soll schon passieren? Im blödesten Fall wird auf 0 gecastet, dann bekommt der "Angreifer" kein Ergebnis. Ich würd mir den Stress nicht antun, immer auf Dezimalziffern zu prüfen. Und wie bereits PHP-Desaster treffend bemerkt hat, ist es ja mit einer reinen Überprüfung auf Dezimalziffern nicht getan, wenn du wirklich eine wasserdichte Prüfung willst. Also entweder ganz oder gar nicht.
Mit Zitat antworten
  #12 (permalink)  
Alt 26-05-2009, 07:57
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ah, mit viel Aufwand "klappt" es bei mir dann auch.

Die Frage die ich mir allerdings eher stelle ist: Warum fragst du für eine int-Spalte mit einem String ab?
intval() in PHP vorher schon drauf und gut ist.
Wenn man dann - trotz falsch übergebenem Wert - trotzdem den korrekten Datensatz liefert, ist das doch umso besser.
Mit Zitat antworten
  #13 (permalink)  
Alt 26-05-2009, 16:30
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von ghostgambler Beitrag anzeigen
Wenn man dann - trotz falsch übergebenem Wert - trotzdem den korrekten Datensatz liefert, ist das doch umso besser.
Jein.

Wenn der Parameter aus einem URL stammt - dann führt das zu mehreren URLs, die die gleichen Inhalte liefern.
/article/1 sollte eindeutig sein - und nicht /article/1xyz und /article/1blah die gleichen Inhalte liefern.
Dagegen, den Fall zu erkennen, und auf /article/1 umzuleiten, spricht nichts - aber einfach kommentarlos den Inhalt anzuzeigen, ohne auf den Fehler in der Adresse zu reagieren, halte ich für falsch.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
mysql


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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Merkwürdiges foreach Verhalten Benny-one PHP Developer Forum 17 22-12-2007 12:31
[PHP5] merkwürdiges $GLOBALS-Verhalten PHP-Desaster PHP Developer Forum 8 06-07-2007 14:41
merkwürdiges verhalten im ie bei flash Kropff Grafik / Design / Flash ... 2 21-04-2006 14:15
merkwürdiges Verhalten galaxy2 PHP Developer Forum 3 06-02-2006 09:07
Merkwürdiges Verhalten von file_get_contents jahlives PHP Developer Forum 18 05-08-2005 09:12

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 02:10 Uhr.