mysqli->خطأ:هو آخر الاستعلام فقط ، أو الخطأ الأخير من الاستعلام المجموعة ؟

StackOverflow https://stackoverflow.com/questions/319423

سؤال

أنا جديدة على mysqli, ومحاولة للتأكد من أن كنت إذا ما يشبه أدناه ، errno سيتم تعيين آخر خطأ ، إن وجدت ، وليس خطأ من الماضي الاستعلام.

هل هذا لائق الممارسة أو يجب أن يكون التحقق من الخطأ في بين كل query ؟

وذلك بفضل!

$mysqli->autocommit(FALSE);

$mysqli->query("INSERT INTO .....");
$mysqli->query("INSERT INTO .....");
$mysqli->query("INSERT INTO .....");
$mysqli->query("INSERT INTO .....");
$mysqli->query("INSERT INTO .....");

if ( 0==$mysqli->errno ) {
    $mysqli->commit();
} else {
    $mysqli->rollback();
    // Handle error
}
هل كانت مفيدة؟

المحلول

mysqli_errno — إرجاع رمز الخطأ أحدث استدعاء دالة.

نصائح أخرى

ولا - فإنه تقارير رمز خطأ من استدعاء دالة mysqli الماضية. الصفر يعني حدث أي خطأ في استدعاء دالة الماضية. حتى إذا فشل أحد في الوسط، وأنك لن تعرف عن ذلك عن طريق فحص فقط في نهاية المطاف.

وبعبارة أخرى، نعم، تحتاج إلى التحقق من رمز الخطأ بعد كل مكالمة وظيفة. لاحظ أن تتم الإشارة إلى خطأ من قيمة الإرجاع $mysqli->query() كذلك. مقتبسا المثال من mysqli_errno ثيقة:

if (!$mysqli->query("INSERT ...")) {
    printf("Errorcode: %d\n", $mysqli->errno);
}

ولا يكون لديك للتحقق بين كل الاستعلام لأنه سيكون دائما تعطيك الخطأ الاستعلام الماضي فقط ... حتى إذا فشل الاستعلام الخاص بك أولا وأخيرا تنفيذ بشكل صحيح ثم أنك لن تحصل على خطأ ... حتى تحقق بعد كل الاستعلام واحدا تلو الآخر وليس أخيرا ...

وIMO أفضل طريقة وأسهل طريقة للقبض على جميع الأخطاء هو توسيع الطبقة mysqli:

class DBException extends Exception {
}
class DBConnectException extends DBException {
}
class DBQueryException extends DBException {
}

class DB extends MySQLi {
    private static $instance = null;

    private function __construct() {
        parent::__construct('host',
                            'username',
                            'passwd',
                            'dbname');

        if ($this->connect_errno) {
            throw new DBConnectException($this->connect_error, $this->connect_errno);
        }
    }

    private function __destructor() {
        parent::close();
    }

    private function __clone() {
    }

    public static function getInstance() {
        if (self::$instance == null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function query($query, $resultmode = MYSQLI_STORE_RESULT) {
        $result = parent::query($query, $resultmode);
        if (!$result) {
            // or do whatever you wanna do when an error occurs
            throw new DBQueryException($this->error, $this->errno);
        }
        return $result;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top