2012-03-29 8 views
0

Mein Code ist wie folgt:einen konstanten Funktionsaufrufes

<?php 
define("ERROR", "SOMETHING WRONG WITH MY DATABASE"); 
... 
if (!mysql_query($q)){ 
    die(ERROR); 
} 
?> 

Jetzt mag ich „etwas falsch mit meiner DATABASE“ mit mysql_error() falls ich es debuggen ersetzen. Was ist der einfachste Weg?

Arbeit Dies scheint nicht zu funktionieren: die Angreifer Figur nicht verwenden mysql_error() unter Produktionsumgebung, kann es aus define("ERROR", mysql_error());

---- bearbeiten ---

Ich will helfen etwas mit meiner Datenbank verbunden? Das ist mein Punkt eines konstanten String mit

wie in C Sie tun können #define x yourfunction() Ich bin nicht sicher, ob ich in PHP das gleiche tue

+0

Was ist falsch daran, nur eine Funktion zu verwenden? – JJJ

+0

@Juhana Ich habe meine Erklärung hinzugefügt .. – w00d

+0

'function my_error() {return mysql_error()}' - Wenn Sie live gehen, ersetzen Sie 'mysql_error()' durch eine Zeichenkette. Es gibt keinen Grund zu versuchen, eine Funktion "konstant" zu machen, was immer das bedeutet. – JJJ

Antwort

3

Die einfache Antwort ist „kann man nicht tun“ . Der springende Punkt Konstante ist, dass es Konstante wie in ist sein Wert wird nie geändert. Wenn es sich auf einen Funktionsaufruf bezieht, kann die Funktion einen beliebigen Wert zurückgeben - und es ist nicht mehr konstant.

Ein Trick, den Sie tun können, ist die Funktion definiert selbst nennen der Wert der Konstante zu sein - und dann eval es auf Nachfrage, etwa so:

define("ERROR", "return mysql_error()"); 
... 
die(eval(ERROR)); 

aber das ist wirklich ein ziemlich schlechter Code. Sie wären viel besser dran

die(mysql_error()); 
+1

Ihr schreckliches, schreckliches 'eval()' würde erfordern, dass die Konstante mit einem Wert von 'return mysql_error();' definiert wird, oder es wird nichts ausgegeben. Aber warum in aller Welt würde jemand das tun, ist jenseits von mir. – DaveRandom

+0

Oder die statische Zeichenfolge der Fehlermeldung vorangestellt, wie @DaveRandom suggeriert. –

+0

ist mysql_error() in einer Produktionsumgebung unsicher? Ich möchte den mysql-Fehler nicht anzeigen, damit der Angreifer etwas daraus ziehen kann ... das ist mein Punkt, eine konstante Zeichenkette zu verwenden. – w00d

1

eine Konstante sollte genau das tun, was der Name schon sagt - Konstante. Sie können eine Konstante nicht neu deklarieren, und alles, was eine Variable Wert hat, sollte in gespeichert werden - Sie ahnen es - Variable.

Allerdings könnte man so etwas tun:

<?php 

    define("ERROR", "SOMETHING WRONG WITH MY DATABASE: "); 

    // ... 

    if (!mysql_query($q)){ 
    die(ERROR . mysql_error()); 
    } 

?> 
1

mysql_error() muss nach der SQL-Operation aufgerufen werden, die Sie zu fangen versuchen. Sie können diesen Fehler nicht mit einer vordeklarierten Konstante oder Variable abfangen. Sie müssen entweder direkt anrufen, oder eine andere Funktion aufrufen, die es nennt, etwa so:

die(mysql_error()); 

oder:

define("ERROR", "Database Problem "); 

function Err() { 
    $sql_err = ERROR . mysql_error(); 
    return $sql_err; 
} 
// sql operation here, then test for error 
die(Err()); 
0

Sie etwas verwenden können, wie Stefan vorgeschlagen und fügen Sie eine DEBUG Konstante, die Sie zwischen Prod- und Entwicklungsumgebung umschalten:

define('DEBUG', 1); 

// In the function: 
// ... 
echo ERROR; 

if (DEBUG){ 
    echo mysql_error(); 
} 

die(); 
Verwandte Themen