Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Fehlerhafte Abfrage (https://www.delphipraxis.net/161510-fehlerhafte-abfrage.html)

Luckie 6. Jul 2011 18:28

Datenbank: MySQL • Version: ??? • Zugriff über: PHP

Fehlerhafte Abfrage
 
Hallo,
habe hier ein kleines MySQL Problem. Ich habe folgende Abfrage:
Code:
SELECT a.*, k.name as k_name FROM adressen a LEFT OUTER JOIN adr_kategorien k on k.id = a.kategorie_id WHERE a.name LIKE '%puff%' ORDER BY k.id, a.name, a.vorname, a.gesch_firma LIMIT 0,15
Die Funktioniert.
Jetzt wollte ich sie erweitern, dass man auch in mehreren feldern suchen kann:
Code:
SELECT a.*, k.name as k_name, k.vorname as k_vorname LEFT OUTER JOIN adr_kategorien k on k.id = a.kategorie_id WHERE (a.name LIKE '%puff%') OR (a.vorname LIKE '%puff%') ORDER BY k.id, a.name, a.vorname LIMIT 0,15
Nur leider bekomme ich da einen Fehler:
Zitat:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT OUTER JOIN adr_kategorien k on k.id = a.kategorie_id WHERE (a.name LIK' at line 3
Aber ich sehe ihn einfach nicht. Die eigentliche Änderung betrifft ja den WHERE Teil. aber was ist da falsch?

s.h.a.r.k 6. Jul 2011 18:37

AW: Fehlerhafte Abfrage
 
Fehlt da nicht das FROM?! :gruebel:

Luckie 6. Jul 2011 18:40

AW: Fehlerhafte Abfrage
 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

Ich sterbe!

s.h.a.r.k 6. Jul 2011 18:43

AW: Fehlerhafte Abfrage
 
Zitat:

Zitat von Luckie (Beitrag 1110374)
Ich sterbe!

Wollen wir mal nicht hoffen :stupid:

PS: Würde die Statements noch parametrisieren ;)

haentschman 6. Jul 2011 18:45

AW: Fehlerhafte Abfrage
 
ja, ja... die berühmten Tunnelblickfehler... Daß die Fehlermeldung dich in die Irre geführt hat...darauf kannst du dich rausreden :thumb:

s.h.a.r.k 6. Jul 2011 18:48

AW: Fehlerhafte Abfrage
 
MySQL hat in meiner Vergangenheit selten sinnvolle Fehlermeldungen geliefert. Da lobe ich mir jedes mal wieder den Delphi-Compiler!

shmia 6. Jul 2011 18:48

AW: Fehlerhafte Abfrage
 
Ein typischer "Tomaten auf Augen" Effekt.
Wenn irgendwas nicht funktioniert sollte man sich daran erinnern dass Programmierer sehr empfänglich für diesen Effekt sind.
In solchen Fällen schalte ich mental in den "alles Beweisen Modus" um.
Dann traue ich mir selber nicht über den Weg, sondern glaube nur das, was ich mir selbst bewiesen habe.

Luckie 6. Jul 2011 18:49

AW: Fehlerhafte Abfrage
 
Parametersieren? Ich bin froh, wenn das überhaupt funktioniert.

s.h.a.r.k 6. Jul 2011 18:52

AW: Fehlerhafte Abfrage
 
Zitat:

Zitat von Luckie (Beitrag 1110379)
Parametersieren? Ich bin froh, wenn das überhaupt funktioniert.

Warum sollte es denn bitte nicht funktionieren?! :gruebel: Die Lösung des Problems hast ja nun.

Luckie 6. Jul 2011 18:53

AW: Fehlerhafte Abfrage
 
Na ja, ich habe keine Ahnung, wie das mit den Parametern funktioniert bzw. was du damit überhaupt meinst.

mkinzler 6. Jul 2011 19:08

AW: Fehlerhafte Abfrage
 
SQL-Code:
SELECT
    a.*,
    k.name as k_name,
    k.vorname as k_vorname
from
    adressen a
        LEFT OUTER JOIN adr_kategorien k on k.id = a.kategorie_id
WHERE
    (a.name LIKE :such1) OR (a.vorname LIKE :such2)
ORDER BY
    k.id, a.name, a.vorname
LIMIT
    0,15;

s.h.a.r.k 6. Jul 2011 19:23

AW: Fehlerhafte Abfrage
 
Zitat:

Zitat von mkinzler (Beitrag 1110385)
SQL-Code:
SELECT
    a.*,
    k.name as k_name,
    k.vorname as k_vorname
from
    adressen a
        LEFT OUTER JOIN adr_kategorien k on k.id = a.kategorie_id
WHERE
    (a.name LIKE :such1) OR (a.vorname LIKE :such2)
ORDER BY
    k.id, a.name, a.vorname
LIMIT
    0,15;

Danke :thumb:

Luckie 6. Jul 2011 19:38

AW: Fehlerhafte Abfrage
 
Na ja, es war ein typischer Copy and Paste Fehler. Das lief mehr nach dem Motto Copy and Waste. ;)

Wo kommt :such1 und :such2 her? Oder woher weiß MySQL dass sich das auf k.name as k_name, k.vorname as k_vorname bezieht?

Stevie 6. Jul 2011 19:42

AW: Fehlerhafte Abfrage
 
Ich würde ja mal die Lektüre eines SQL Tutorials empfehlen. :roll:

mkinzler 6. Jul 2011 19:44

AW: Fehlerhafte Abfrage
 
:such1 und :such 2 sind die Parameter in der parametrisierten Abfrage.

Parameter haben den Vorteil, dass eine solche Abfarge leicht wiederverwendebar ist. Es muss dann nur noch der/die geänderten Parameter übertragen werden.

Luckie 6. Jul 2011 19:46

AW: Fehlerhafte Abfrage
 
Zitat:

Zitat von Stevie (Beitrag 1110393)
Ich würde ja mal die Lektüre eines SQL Tutorials empfehlen. :roll:

Habe ich ja gemacht. Aber so tief bin ich dann doch nicht eingestiegen.

OK. Und wo kommen die her? Wie legt man diese fest?

mkinzler 6. Jul 2011 19:51

AW: Fehlerhafte Abfrage
 
Delphi-Quellcode:
DataSet.SQL.Text := '<Abfrage>';
DataSet.Prepare;
1. Abfrage: Puff oder Bordell
Delphi-Quellcode:
DataSet.ParamByName('such1').Value := 'Puff';
DataSet.ParamByName('such2').Value := 'Bordell';
DataSet.Open;
2.Abfrage: Puff oder Mayer
Delphi-Quellcode:
DataSet.ParamByName('such2').Value := 'Mayer';
DataSet.Open;
Paramter sind Platzhalter, welchen man später beliebige Werte zuweisen kann ohne dass die Abfrage im Ganzen neu gesetzt werden und diese "kompilliert" werden muss (Parsen, Plan Bilden ...)

Luckie 6. Jul 2011 19:57

AW: Fehlerhafte Abfrage
 
Ich arbeite mit PHP. Ich habe aber trotzdem hier gepostet, weil es im vorrangig MySQL ging.

mkinzler 6. Jul 2011 19:58

AW: Fehlerhafte Abfrage
 
Welche DB-Bibliothek?

Das Prinzip ist aber das Selbe.

Luckie 6. Jul 2011 20:00

AW: Fehlerhafte Abfrage
 
Öhm. Gar keine? Alles von Hand mit PHP. Du weißt doch, ich bin Purist. ;)

mkinzler 6. Jul 2011 20:03

AW: Fehlerhafte Abfrage
 
Dann musst du die mysqli-Funktionen nutzen:

PHP-Quellcode:
<?php
$mysqli = new mysqli("server", "username", "password", "database_name");

// TODO - Check that connection was successful.

$unsafe_variable = $_POST["user-input"];

$stmt = $mysqli->prepare("INSERT INTO table (column) VALUES (?)");

// TODO check that $stmt creation succeeded

// s means the database expects a string
$stmt->bind_param("s", $unsafe_variable);

$stmt->execute();

$stmt->close();

$mysqli->close();
?>
Btw. Auch als Purist solltest du mal einen Blick auf MDB2 oder PDO werfen.

Stevie 6. Jul 2011 20:05

AW: Fehlerhafte Abfrage
 
SQL Injection ist halt was tolles :twisted:

Luckie 6. Jul 2011 20:08

AW: Fehlerhafte Abfrage
 
Na ja, wenn jemand soweit kommt, dass er so was machen könnte, habe ich ganz andere Probleme. ;)

Das (?) wird dann durch den zweiten Parameter von bind_param ersetzt?

mkinzler 6. Jul 2011 20:11

AW: Fehlerhafte Abfrage
 
Zitat:

Na ja, wenn jemand soweit kommt, dass er so was machen könnte, habe ich ganz andere Probleme.
Passiert schnell, wenn man hier GET oder POST-Werte einsetzt.

Zitat:

Das (?) wird dann durch den zweiten Parameter von bind_param ersetzt?
Dem Parameter wird der Wert zugewiesen. (In diesem Fall hat dieser keinen Namen)

Luckie 6. Jul 2011 20:14

AW: Fehlerhafte Abfrage
 
Zitat:

Zitat von mkinzler (Beitrag 1110410)
Zitat:

Das (?) wird dann durch den zweiten Parameter von bind_param ersetzt?
Dem Parameter wird der Wert zugewiesen. (In diesem Fall hat dieser keinen Namen)

Das verstehe ich jetzt nicht.

mkinzler 6. Jul 2011 20:22

AW: Fehlerhafte Abfrage
 
Die Parameter sind eine Features des DBMS.

Beispiel Insert von mehreren Datensätzen

1. ohne Parameter:

SQL-Code:
insert into person ( name, vorname) values ( 'Puff', 'Michael');
insert into person ( name, vorname) Values ( 'Kinzler', 'Markus');
Es wird zuerst die 1. Abfrage an das DBMS gesendet, diese wird geparst und eine Abfargeplan gebildet.
Entsprechend für jeden weiteren Insert.

2. mit Parameter:

SQL-Code:
insert into person ( name, vorname) values ( :name, :vorname);
Es wird die Abfrage mit Platzhalter und nicht mit konkreten Werten an das DBMS gesendet. Dieses parst sie, bildet einen Plan und erzeugt die Parameter.

Beim eigentlichen Insert werden dann nur die Werte für die Parameter an das DBMS gesendet und die Abfrage mit diesen werten ausgeführt.
Das ist deutlich schneller, da die Abfrage nur einmal geparst und der Plan nur einmal ermittlet werden muss.

Ausserdem wird so wie erwähnt das Risiko von sql injection verringert.

Luckie 6. Jul 2011 20:28

AW: Fehlerhafte Abfrage
 
Code:
<?php
$mysqli = new mysqli("server", "username", "password", "database_name");

// TODO - Check that connection was successful.

$stmt = $mysqli->prepare("insert into person ( name, vorname) values ( :name, :vorname);");

// TODO check that $stmt creation succeeded

// s means the database expects a string
$stmt->bind_param("s", ???);

$stmt->execute();

$stmt->close();

$mysqli->close();
?>
Was müsste jetzt bei den Fragezeichen stehen?

fkerber 6. Jul 2011 20:31

AW: Fehlerhafte Abfrage
 
Hi,

deine konkreten Werte - also sowas wie $_GET['vorname'].


LG, Frederic

mkinzler 6. Jul 2011 20:34

AW: Fehlerhafte Abfrage
 
PHP-Quellcode:
$stmt = $mysqli->prepare("insert into person ( name, vorname) values ( ?, ?);");

PHP-Quellcode:
$stmt->bind_param("ss", 'Puff', 'Michael');

http://php.net/manual/de/mysqli-stmt.bind-param.php

Luckie 6. Jul 2011 20:38

AW: Fehlerhafte Abfrage
 
Ah, OK. Jetzt habe ich es verstanden. Das würde aber einen ziemlichen Refactoring Aufwand bedeuten. Ich glaube nicht, dass ich das in naher Zukunft machen werden. Höchstens wenn es mich packt, dann gibt es aber einen kompletten Rewrite. ;)

mkinzler 6. Jul 2011 20:44

AW: Fehlerhafte Abfrage
 
Dafür wird das System dann schneller, übersichtlicher und sicherer.

Luckie 6. Jul 2011 20:54

AW: Fehlerhafte Abfrage
 
Na ja, bei 15 Datensätzen ist die Performance nicht so wichtig und ich trage ja auch nicht hundert Datensätze auf einmal ein. ;)

s.h.a.r.k 6. Jul 2011 21:03

AW: Fehlerhafte Abfrage
 
Zitat:

Zitat von Luckie (Beitrag 1110409)
Na ja, wenn jemand soweit kommt, dass er so was machen könnte, habe ich ganz andere Probleme. ;)

Schau dir mal die Hacks an, die in letzter Zeit durchgeführt wurden, also von Anonymous, Antisec (ehem. Lulsec) etc. Da waren einige SQL Injections dabei, die genau damit zu tun haben ;)

PS: Tut mir leid, dass ich nicht ausführlicher auf diese Technik zu sprechen gekommen bin. War etwas in Eile und ging in der Annahme, dass du bzgl. Datenbanken schon ausreichend Erfahrung hast -- als erfahrender Programmierer kommt man da ja eigentlich zwangsläufig kaum vorbei. Daher Asche auf mein Haupt :oops:

Luckie 6. Jul 2011 21:11

AW: Fehlerhafte Abfrage
 
Na ja, ich konnte mich bisher im Datenbanken und Webdesign erfolgreich drücken. Macht aber nichts.

blackfin 6. Jul 2011 22:40

AW: Fehlerhafte Abfrage
 
Wenn man alle Werte, die über GET / POST kommen ordentlich escaped und/oder validiert, sollten SQL Injections aber auch nicht so das Problem sein.
Natürlich sind Parameter generell der bessere Ansatz, aber bevor man alles auf Parameter umschreibt, kann man zumindest mal die eingefügten Variablen escapen und validieren.

Luckie 6. Jul 2011 22:43

AW: Fehlerhafte Abfrage
 
Wie gesagt, die DB ist nicht öffentlich. Deswegen habe ich da nichts gemacht,


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz