Εμφάνιση όλων των σφαλμάτων και των προειδοποιήσεων

ΠΡΟΗΓΟΥΜΕΝΗ ΕΝΗΜΕΡΩΣΗ 2:

Έχω πλέον αφαιρέσει τα ακόλουθα από το αρχείο .php:

<?php error_reporting( E_ALL ); ?>

Έχω ρυθμίσει το display_erros στο php.ini ως εξής:

display_errors = On

Η αναφορά σφαλμάτων έχει οριστεί ως εξής στο αρχείο php.ini:

error_reporting = E_ALL | E_STRICT

Μετά την επανεκκίνηση του Apache, εξακολουθώ να μην λαμβάνω σφάλματα/προειδοποιήσεις.

ΠΡΟΗΓΗΣΗ 1:

Άλλαξα την αναφορά σφαλμάτων στο αρχείο php.ini από:

error_reporting = E_ALL &amp, ~E_DEPRECATED

σε

error_reporting = E_ALL | E_STRICT

Μετά από αυτό έκανα επανεκκίνηση του Apache, π.χ.

/etc/init.d/apache2 restart

Αλλά η σελίδα εξακολουθεί να μην εμφανίζει λάθη/προειδοποιήσεις οποιουδήποτε είδους.

ΑΡΧΙΚΉ ΕΡΏΤΗΣΗ:

Το ακόλουθο σενάριο παράγει μια προειδοποίηση επειδή το $err βρίσκεται μέσα στην εντολή if. Γιατί αυτή η προειδοποίηση δεν εμφανίζεται στη σελίδα PHP σε ένα πρόγραμμα περιήγησης ιστού;

Πρέπει να κοιτάξω τα αρχεία καταγραφής του Apache για να δω την προειδοποίηση. Επίσης, αν αλλάξω σκόπιμα το "insert into" σε "delete into", δεν εμφανίζεται σφάλμα στη σελίδα PHP. Γιατί τα σφάλματα δεν εμφανίζονται στην πραγματική σελίδα PHP;

<?php
    error_reporting(E_ALL);
?>

<html>
    <head>
        <title></title>
        <link rel="icon" type="image/png" href="favicon.ico">

        <?php
            if ($_SERVER['REQUEST_METHOD'] == 'POST') {
                $err = array();

                if (empty( $_POST['display_name']))
                    $err[] = "display name field is required";
                if (empty( $_POST['email']))
                    $err[] = "email field is required";
                if (empty( $_POST['password']))
                    $err[] = "password field is required";

                if (!$err) {
                    try {
                        $DBH = new PDO("mysql:host=localhost;dbname=database1", "user", "pass");
                        $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                        $STH = $DBH->prepare("delete into table1 (display_name, email, password) values ( :display_name, :email, :password )");

                        $STH->bindParam(':display_name', $_POST['display_name'], PDO::PARAM_STR, 100);
                        $STH->bindParam(':email', $_POST['email'], PDO::PARAM_STR, 100);
                        $STH->bindParam(':password', $_POST['password'], PDO::PARAM_STR, 100);

                        $STH->execute();

                        $STH = $DBH->prepare("delete into table2 ( username, status, users_id ) values ( :username, :status, :users_id )");

                        $strStatus = 1;

                        $STH->bindParam(':username', $_POST['display_name'], PDO::PARAM_STR, 100);
                        $STH->bindParam(':status', $strStatus, PDO::PARAM_INT, 1);
                        $STH->bindParam(':users_id', $_POST['referer'], PDO::PARAM_INT, 1);

                        $STH->execute();

                        $DBH = null;
                    }
                    catch (PDOException $e) {
                        echo $e->getMessage();
                    }

                    header("Location: " . $_SERVER['PHP_SELF']);
                    exit;
                }
                else {
                    foreach ($_POST as $key => $val) {
                        $form[$key] = htmlspecialchars($val);
                    }
                }
            }
            else {
                $form['display_name'] = $form['email'] = $form['password'] = '';
            }
        ?>
    </head>

    <body>
        <?php foreach($err as $line) { ?>
        <div style="error"><?php echo $line; ?></div>
        <?php } ?>

        <h1>Register</h1>

        <form method="post">
            Referers id:<br/>
            <input type="text" name="referer" /><br/><br/>

            Name:<br/>
            <input type="text" name="display_name" value="<?php echo $form['display_name']; ?>" /><br/><br/>

            Email:<br/>
            <input type="text" name="email" value="<?php echo $form['email']; ?>" /><br/><br/>

            Password:<br/>
            <input type="text" name="password" value="<?php echo $form['password']; ?>" /><br/><br/>

            <input type="submit" value="register" />
        </form>
    </body>
</html>
Λύση

Η εμφάνιση σφαλμάτων μπορεί να απενεργοποιηθεί στο αρχείο ρυθμίσεων του Apache ή στο αρχείο php.ini.

Μπορείτε να το ενεργοποιήσετε στο σενάριο:

error_reporting(E_ALL);
ini_set('display_errors', 1);

Θα πρέπει να δείτε τα ίδια μηνύματα στο αρχείο καταγραφής σφαλμάτων της PHP.

Σχόλια (10)

Κατευθείαν από το αρχείο php.ini:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error handling and logging ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; This directive informs PHP of which errors, warnings and notices you would like
; it to take action for. The recommended way of setting values for this
; directive is through the use of the error level constants and bitwise
; operators. The error level constants are below here for convenience as well as
; some common settings and their meanings.
; By default, PHP is set to take action on all errors, notices and warnings EXCEPT
; those related to E_NOTICE and E_STRICT, which together cover best practices and
; recommended coding standards in PHP. For performance reasons, this is the
; recommend error reporting setting. Your production server shouldn't be wasting
; resources complaining about best practices and coding standards. That's what
; development servers and development settings are for.
; Note: The php.ini-development file has this setting as E_ALL. This
; means it pretty much reports everything which is exactly what you want during
; development and early testing.
;
; Error Level Constants:
; E_ALL             - All errors and warnings (includes E_STRICT as of PHP 5.4.0)
; E_ERROR           - fatal run-time errors
; E_RECOVERABLE_ERROR  - almost fatal run-time errors
; E_WARNING         - run-time warnings (non-fatal errors)
; E_PARSE           - compile-time parse errors
; E_NOTICE          - run-time notices (these are warnings which often result
;                     from a bug in your code, but it's possible that it was
;                     intentional (e.g., using an uninitialized variable and
;                     relying on the fact it is automatically initialized to an
;                     empty string)
; E_STRICT          - run-time notices, enable to have PHP suggest changes
;                     to your code which will ensure the best interoperability
;                     and forward compatibility of your code
; E_CORE_ERROR      - fatal errors that occur during PHP's initial startup
; E_CORE_WARNING    - warnings (non-fatal errors) that occur during PHP's
;                     initial startup
; E_COMPILE_ERROR   - fatal compile-time errors
; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
; E_USER_ERROR      - user-generated error message
; E_USER_WARNING    - user-generated warning message
; E_USER_NOTICE     - user-generated notice message
; E_DEPRECATED      - warn about code that will not work in future versions
;                     of PHP
; E_USER_DEPRECATED - user-generated deprecation warnings
;
; Common Values:
;   E_ALL (Show all errors, warnings and notices including coding standards.)
;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

Για καθαρή ανάπτυξη επιλέγω:

error_reporting = E_ALL ^ E_NOTICE ^ E_WARNING

Επίσης μην ξεχάσετε να βάλετε το display_errors στο on

display_errors = On

Μετά από αυτό, επανεκκινήστε τον διακομιστή σας για τον Apache στο Ubuntu:

sudo /etc/init.d/apache2 restart
Σχόλια (2)

Ορίστε τα στο php.ini:

;display_startup_errors = On
display_startup_errors=off
display_errors =on
html_errors= on

Από τη σελίδα PHP σας, χρησιμοποιήστε ένα κατάλληλο φίλτρο για την αναφορά σφαλμάτων.

error_reporting(E_ALL);

Τα φίλτρα μπορούν να κατασκευαστούν ανάλογα με τις απαιτήσεις.

E_ALL
E_ALL | E_STRICT
Σχόλια (0)