MySQLi ifadeler hata bildirimini hazırlandı

3 Cevap php

I'm trying to get my head around MySQli and I'm confused by the error reporting. I am using the return value of the MySQLi 'prepare' statement to detect errors when executing SQL, like this:

$stmt_test =  $mysqliDatabaseConnection->stmt_init();
if($stmt_test->prepare("INSERT INTO testtable VALUES (23,44,56)"))
{
 $stmt_test->execute();
 $stmt_test->close();
}
else echo("Statement failed: ". $stmt_test->error . "<br>");

Ancak, SQL deyiminin hazırlama ve yürütme hataları tespit değil bir hata varsa sadece tespit hazırlamak açıklamada dönüş değeri nedir? Bu yüzden, bu nedenle de bu gibi hatalarını bayrak benim yürütmek hat değiştirmek gerekir:

if($stmt_test->execute()) $errorflag=true;

Ben de ifadesinden sonra aşağıdaki yapmalıyım Ve sonra sadece idam güvenli olması için:

if($stmt_test->errno) {$errorflag=true;}

... Ya ben ile başlar ve MySQLi üzerinde dönüş değeri hazırlamak Tamam 'deyimi tanımlar sorgunun tam yürütme ile ilgili tüm hataları yakalar?

Thanks C

3 Cevap

Ben son iki gün içinde iki kez önce bu yazdı (yani benim için o soruları biraz farklı başladı bile yinelenen bulunuyor).

Mysqli'nin Her yöntem başarısız olabilir. Her dönüş değerini test etmelisiniz. Biri başarısız olursa, bunu olmasını bekliyoruz durumda değil, bir nesne ile devam etmek mantıklı olmadığını düşünüyorum. (Potansiyel bir "güvenli" devlet, ama ben burada bir sorun değil bence değil.)

Son operasyon sadece hata mesajı bağlantı / deyimi başına depolanan bu yana bir şey yanlış gitti sonra devam ederseniz what hataya neden hakkında bilgi kaybedebilirsiniz. Sen script, (yine sadece geçici bir sorunu) deneyin bir şey değiştirmek veya tamamen kurtarmak için (ve bir hatayı bildirmek) karar vermek bu bilgiyi kullanmak isteyebilirsiniz. Ve bu çok daha kolay hata ayıklama yapar.

$stmt = $mysqli->prepare("INSERT INTO testtable VALUES (?,?,?)");
// prepare() can fail because of syntax errors, missing privileges, ....
if ( false===$stmt ) {
  // and since all the following operations need a valid/ready statement object
  // it doesn't make sense to go on
  // you might want to use a more sophisticated mechanism than die()
  // but's it's only an example
  die('prepare() failed: ' . htmlspecialchars($mysqli->error));
}

$rc = $stmt->bind_param('iii', $x, $y, $z);
// bind_param() can fail because the number of parameter doesn't match the placeholders in the statement
// or there's a type conflict(?), or ....
if ( false===$rc ) {
  // again execute() is useless if you can't bind the parameters. Bail out somehow.
  die('bind_param() failed: ' . htmlspecialchars($stmt->error));
}

$rc = $stmt->execute();
// execute() can fail for various reasons. And may it be as stupid as someone tripping over the network cable
// 2006 "server gone away" is always an option
if ( false===$rc ) {
  die('execute() failed: ' . htmlspecialchars($stmt->error));
}

$stmt->close();

Bu sorunuzu veya cevap değil emin eğer. Üzgünüz değilse

Bir sorgu mysql veritabanından bildirilen hata odak noktası olarak bağlantı nesnesi kullanmanız gerekir almak için.

bu yüzden:

echo $mysqliDatabaseConnection->error

Bir sorgu mysql gönderilen hata yankı.

Umut olur

Completeness

Her iki $mysqli ve $statement kontrol etmeniz gerekir. Onlar yanlış varsa, çıktı $mysqli->error veya $statement->error, sırasıyla gerekir.

Efficiency

Feshedebilir basit komut dosyaları için, ben mesajı ile bir PHP hatası tetikleyen basit bir gömlekleri kullanabilirsiniz. Daha karmaşık bir uygulama için, bir hata uyarı sistemi bir istisna atarak, örneğin, yerine aktif olmalıdır.

Usage example 1: Simple script

# This is in a simple command line script
$mysqli = new mysqli('localhost', 'buzUser', 'buzPassword');
$q = "UPDATE foo SET bar=1";
($statement = $mysqli->prepare($q)) or trigger_error($mysqli->error, E_USER_ERROR);
$statement->execute() or trigger_error($statement->error, E_USER_ERROR);

Usage example 2: Application

# This is part of an application
class FuzDatabaseException extends Exception {
}

class Foo {
  public $mysqli;
  public function __construct(mysqli $mysqli) {
    $this->mysqli = $mysqli;
  }
  public function updateBar() {
    $q = "UPDATE foo SET bar=1";
    $statement = $this->mysqli->prepare($q);
    if (!$statement) {
      throw new FuzDatabaseException($mysqli->error);
    }

    if (!$statement->execute()) {
      throw new FuzDatabaseException($statement->error);
    }
  }
}

$foo = new Foo(new mysqli('localhost','buzUser','buzPassword'));
try {
  $foo->updateBar();
} catch (FuzDatabaseException $e)
  $msg = $e->getMessage();
  // Now send warning emails, write log
}