MySQL, PHP und die Backticks
Tom
- php
Hello,
irgendwie lässt mich das nicht schlafen. Oder liegts am Wetter? Jedenfalls geht mir schon die ganze Nacht die Frage im Kopf herum, wie diese drei Dinge zusammenpassen:
Übergebe ich in PHP einen String zur Ausgabe an die Standardausgabe mit echo oder print, un dieser String enthält einen mit Backticks begrenzten Teilstring, dann wird versucht, diesen vom Befehlsinterpreter des Betriebssystem ausführen zu lassen, also als Kurzanweuisung für exec() o.ä.
Innerhalb eines MySQL-Querys kann ich nun Feldnamen mit Backticks markieren, was ich in den letzen Wochen auch öfter in Beispielen gesehen habe.
Nun empfiehlt es sich ja gerade in der Entwicklungsphase von Modulen mit SQL-Quries, diese vor Ausführung ausgeben zu lassen.
Meine Frage:
------------
Was passiert dann mit den mit Backticks begrenzten Namen? Eigentlich müssten die doch dann vom Betriebssystem als Befehle interpretiert werde, was natürlich sinnlos wäre...
Liebe Grüße aus http://www.braunschweig.de
Tom
Moin!
Innerhalb eines MySQL-Querys kann ich nun Feldnamen mit Backticks markieren, was ich in den letzen Wochen auch öfter in Beispielen gesehen habe.
Kann man - muß man aber nicht. Dient nur dazu, reservierte Worte auch als Namen nutzen zu können, was in meinen Augen nicht sehr sinnvoll ist.
Insofern erledigt sich das Problem von selbst, wenn man darauf verzichtet. :)
- Sven Rautenberg
Hello Sven, hello world,
Innerhalb eines MySQL-Querys kann ich nun Feldnamen mit Backticks markieren, was ich in den letzen Wochen auch öfter in Beispielen gesehen habe.
Kann man - muß man aber nicht. Dient nur dazu, reservierte Worte auch als Namen nutzen zu können, was in meinen Augen nicht sehr sinnvoll ist.
Insofern erledigt sich das Problem von selbst, wenn man darauf verzichtet. :)
Ja, wenn man darauf verzichtet. Ich habe aber nun leider einen Kunden, der mir in seinem Pflichtenheft vorschreibt, dass Tabellen- und Feldnamen in Backticks zu stehen haben und bei jedem SQL-Statement die Ausgabe des Statements in einer eigens dafür bereitgehaltenen Statuszeile wünscht, sofern die Debug-Funktion aktiviert ist...
Wie mache ich das nun?
Das kann ich doch nicht einfach so ausgeben lassen - oder?
Muss ich die Backticks irgendwie ersetzen? Reicht da htmlentities()?
Ich kann aber keine Ersetzung dafür finden.
Ich kann da leider auch nicht dran rütteln. Ist eine größere Firma, die es gewohnt ist, jede Eigeninititive mit weiteren 90 Tagen Zahlungsziel "zur Prüfung" zu "belohnen". Das kann ich mir im Moment nicht leisten.
Liebe Grüße aus http://www.braunschweig.de
Tom
Moin!
Insofern erledigt sich das Problem von selbst, wenn man darauf verzichtet. :)
Ja, wenn man darauf verzichtet. Ich habe aber nun leider einen Kunden, der mir in seinem Pflichtenheft vorschreibt, dass Tabellen- und Feldnamen in Backticks zu stehen haben und bei jedem SQL-Statement die Ausgabe des Statements in einer eigens dafür bereitgehaltenen Statuszeile wünscht, sofern die Debug-Funktion aktiviert ist...
Ich konnte nicht feststellen, das ausgegebene Backticks nochmal von der Kommandozeile ausgeführt werden. Das sind stinknormale Zeichen.
#!/usr/bin/php
<?php
echo "´backtick´";
?>
Ich sehe das Problem nicht.
- Sven Rautenberg
Hello,
Ich konnte nicht feststellen, das ausgegebene Backticks nochmal von der Kommandozeile ausgeführt werden. Das sind stinknormale Zeichen.
#!/usr/bin/php
<?php
echo "´backtick´";
?>Ich sehe das Problem nicht.
Die von dir verwwendeten sind ja auch Vorwardticks...
<?php
echo "backtick
";
?>
So müsste es aussehen...
Liebe Grüße aus http://www.braunschweig.de
Tom
Moin!
#!/usr/bin/php
<?php
echo "´backtick´";
?>Ich sehe das Problem nicht.
Die von dir verwwendeten sind ja auch Vorwardticks...
...ich wußte es... :)
<?php
echo "backtick
";
?>So müsste es aussehen...
Und macht auch keine Probleme. Es wird erwartungsgemäß (und ohne irgendeine Shell-Fehlermeldung über das nichtexistente Programm "backtick"
backtick
ausgegeben.
- Sven Rautenberg
Hello,
#!/usr/bin/php
<?php
echo "´backtick´";
?>Ich sehe das Problem nicht.
Die von dir verwwendeten sind ja auch Vorwardticks...
...ich wußte es... :)
Was wusstest Du, dass ich nachfasse?
<?php
echo "backtick
";
?>So müsste es aussehen...
Und macht auch keine Probleme. Es wird erwartungsgemäß (und ohne irgendeine Shell-Fehlermeldung über das nichtexistente Programm "backtick"
backtick
ausgegeben.
Dann verstehe ich aber das Beispiel nicht mehr:
http://de2.php.net/manual/en/language.operators.execution.php
Wie sind denn Deine Systemeinstellungen?
Haben die bei Dir denn überhaupt schon mal getan, was sie sollten?
Liebe Grüße aus http://www.braunschweig.de
Tom
Moin!
<?php
echo "backtick
";
?>So müsste es aussehen...
Und macht auch keine Probleme. Es wird erwartungsgemäß (und ohne irgendeine Shell-Fehlermeldung über das nichtexistente Programm "backtick"
backtick
ausgegeben.Dann verstehe ich aber das Beispiel nicht mehr:
http://de2.php.net/manual/en/language.operators.execution.php
Bemerke bitte den Unterschied zwischen:
$output = cat /etc/password
;
echo "<pre>$output</pre>";
und
echo "cat /etc/password
";
Das eine ruft (weil Backticks entsprechend ausgeführt werden) ein externes Programm auf und speichert dessen Ausgabe in einer Variablen.
Das andere ist ganz simpler Text.
Wenn du Backticks im SQL-String verwendest du den nachher ausgibst, dann ist das `-Zeichen ein ganz stinknormales Zeichen, das einfach nur ausgegeben wird. Genau wie das "-Zeichen in einem String ja auch nur ein ganz normales Zeichen ist, das einfach ausgegeben wird, nicht aber vorzeitig den String beendet:
$output= '"';
echo "$output und so weiter";
Das gibt ohne Fehlermeldung
" und so weiter
aus.
- Sven Rautenberg
Hello,
Bemerke bitte den Unterschied zwischen:
Ja, guten Morgen! Habe ich auch die ganze Zeit drüber nachgedacht, aber irgendwie wohl immer im Kreis. Die Ausführung erfolgt ja bereits bei der Zuweisung an $output. Ich habe da in Gedanken immer
$output = "cat /etc/password
"; draus gemacht. Ist ja was völlig anderes!
$output =
cat /etc/password
;
echo "<pre>$output</pre>";und
echo "
cat /etc/password
";Das eine ruft (weil Backticks entsprechend ausgeführt werden) ein externes Programm auf und speichert dessen Ausgabe in einer Variablen.
Das andere ist ganz simpler Text.
Wenn du Backticks im SQL-String verwendest du den nachher ausgibst, dann ist das `-Zeichen ein ganz stinknormales Zeichen, das einfach nur ausgegeben wird. Genau wie das "-Zeichen in einem String ja auch nur ein ganz normales Zeichen ist, das einfach ausgegeben wird, nicht aber vorzeitig den String beendet:
$output= '"';
echo "$output und so weiter";Das gibt ohne Fehlermeldung
" und so weiter
aus.
----------------
Dann könnte ich mich ja nun schlafen legen...
allerdings habe ich mir ja schon wieder ein neues Rätsel gebastelt, weil ich "mal eben schnell" ein Locking in das speichern.php einbauen wollte. *grummel*
Liebe Grüße aus http://www.braunschweig.de
Tom
Moin!
Dann könnte ich mich ja nun schlafen legen...
Zum Beispiel. War gestern abend ja auch schon ziemlich spät.
allerdings habe ich mir ja schon wieder ein neues Rätsel gebastelt, weil ich "mal eben schnell" ein Locking in das speichern.php einbauen wollte. *grummel*
Was ist dein Problem?
$fp = fopen("/tmp/lock.txt", "w+");
if (flock($fp, LOCK_EX)) { // do an exclusive lock
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN); // release the lock
} else {
echo "Couldn't lock the file !";
}
fclose($fp);
Locking kann so einfach sein.
Und gegen die möglichen Problem bei Modus "w" und "w+" kann man sich (Userkommentare sind schön) ja auch mit Modus "a" und ftruncate() schützen.
- Sven Rautenberg
Hello,
Was ist dein Problem?
Locking kann so einfach sein.
Das Locking war nicht das Problem, sondern die Downloadfunktion des Scriptes. Auf meinem Testserver ist immer ein Code ausgelöst worden, der den Browser zum Anzeigen des HTTP-Headers gebracht hat. Da steckt noch irgendwo der Wurm drin. Hoffentlich nicht sobig.c oder wie der heißt...
siehe [pref:t=67743&m=387736]
Liebe Grüße aus http://www.braunschweig.de
Tom