![]() |
Datenbank: MySQL • Version: ??? • Zugriff über: PHP
Fehlerhafte Abfrage
Hallo,
habe hier ein kleines MySQL Problem. Ich habe folgende Abfrage:
Code:
Die Funktioniert.
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
Jetzt wollte ich sie erweitern, dass man auch in mehreren feldern suchen kann:
Code:
Nur leider bekomme ich da einen Fehler:
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
Zitat:
|
AW: Fehlerhafte Abfrage
Fehlt da nicht das FROM?! :gruebel:
|
AW: Fehlerhafte Abfrage
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
Ich sterbe! |
AW: Fehlerhafte Abfrage
Zitat:
PS: Würde die Statements noch parametrisieren ;) |
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:
|
AW: Fehlerhafte Abfrage
MySQL hat in meiner Vergangenheit selten sinnvolle Fehlermeldungen geliefert. Da lobe ich mir jedes mal wieder den Delphi-Compiler!
|
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. |
AW: Fehlerhafte Abfrage
Parametersieren? Ich bin froh, wenn das überhaupt funktioniert.
|
AW: Fehlerhafte Abfrage
Zitat:
|
AW: Fehlerhafte Abfrage
Na ja, ich habe keine Ahnung, wie das mit den Parametern funktioniert bzw. was du damit überhaupt meinst.
|
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; |
AW: Fehlerhafte Abfrage
Zitat:
|
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? |
AW: Fehlerhafte Abfrage
Ich würde ja mal die Lektüre eines SQL Tutorials empfehlen. :roll:
|
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. |
AW: Fehlerhafte Abfrage
Zitat:
OK. Und wo kommen die her? Wie legt man diese fest? |
AW: Fehlerhafte Abfrage
Delphi-Quellcode:
1. Abfrage: Puff oder Bordell
DataSet.SQL.Text := '<Abfrage>';
DataSet.Prepare;
Delphi-Quellcode:
2.Abfrage: Puff oder Mayer
DataSet.ParamByName('such1').Value := 'Puff';
DataSet.ParamByName('such2').Value := 'Bordell'; DataSet.Open;
Delphi-Quellcode:
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 ...)
DataSet.ParamByName('such2').Value := 'Mayer';
DataSet.Open; |
AW: Fehlerhafte Abfrage
Ich arbeite mit PHP. Ich habe aber trotzdem hier gepostet, weil es im vorrangig MySQL ging.
|
AW: Fehlerhafte Abfrage
Welche DB-Bibliothek?
Das Prinzip ist aber das Selbe. |
AW: Fehlerhafte Abfrage
Öhm. Gar keine? Alles von Hand mit PHP. Du weißt doch, ich bin Purist. ;)
|
AW: Fehlerhafte Abfrage
Dann musst du die mysqli-Funktionen nutzen:
PHP-Quellcode:
Btw. Auch als Purist solltest du mal einen Blick auf MDB2 oder PDO werfen.
<?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(); ?> |
AW: Fehlerhafte Abfrage
![]() |
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? |
AW: Fehlerhafte Abfrage
Zitat:
Zitat:
|
AW: Fehlerhafte Abfrage
Zitat:
|
AW: Fehlerhafte Abfrage
Die Parameter sind eine Features des DBMS.
Beispiel Insert von mehreren Datensätzen 1. ohne Parameter:
SQL-Code:
Es wird zuerst die 1. Abfrage an das DBMS gesendet, diese wird geparst und eine Abfargeplan gebildet.
insert into person ( name, vorname) values ( 'Puff', 'Michael');
insert into person ( name, vorname) Values ( 'Kinzler', 'Markus'); Entsprechend für jeden weiteren Insert. 2. mit Parameter:
SQL-Code:
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.
insert into person ( name, vorname) values ( :name, :vorname);
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. |
AW: Fehlerhafte Abfrage
Code:
Was müsste jetzt bei den Fragezeichen stehen?
<?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(); ?> |
AW: Fehlerhafte Abfrage
Hi,
deine konkreten Werte - also sowas wie $_GET['vorname']. LG, Frederic |
AW: Fehlerhafte Abfrage
PHP-Quellcode:
$stmt = $mysqli->prepare("insert into person ( name, vorname) values ( ?, ?);");
PHP-Quellcode:
$stmt->bind_param("ss", 'Puff', 'Michael');
![]() |
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. ;)
|
AW: Fehlerhafte Abfrage
Dafür wird das System dann schneller, übersichtlicher und sicherer.
|
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. ;)
|
AW: Fehlerhafte Abfrage
Zitat:
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: |
AW: Fehlerhafte Abfrage
Na ja, ich konnte mich bisher im Datenbanken und Webdesign erfolgreich drücken. Macht aber nichts.
|
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. |
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