IT Share you

MySQLi 준비된 문 오류보고

shareyou 2020. 12. 14. 21:05
반응형

MySQLi 준비된 문 오류보고


MySQli를 둘러 보려고하는데 오류보고가 혼란 스럽습니다. 다음과 같이 SQL을 실행할 때 오류를 감지하기 위해 MySQLi 'prepare'문의 반환 값을 사용하고 있습니다.

$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>");

그러나 prepare 문의 반환 값은 SQL 문의 준비에 오류가있는 경우에만 감지하고 실행 오류는 감지하지 못합니까? 그렇다면 실행 라인을 다음과 같이 플래그 오류로 변경해야합니다.

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

그리고 안전을 위해 문이 실행 된 후 다음을 수행해야합니다.

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

... 또는 시작해도 괜찮 았고 MySQLi prepare '문의 반환 값은 정의 된 쿼리의 전체 실행과 관련된 모든 오류를 캡처합니까?

감사합니다 C


나는 지난 이틀 동안 전에 이것을 두 번 썼습니다 (그래서 질문이 약간 다르게 시작되었지만 중복되었습니다).

mysqli의 각 방법은 실패 할 수 있습니다. 각 반환 값을 테스트해야합니다. 하나가 실패하면 예상 한 상태에 있지 않은 객체를 계속 사용하는 것이 합당한 지 생각해보십시오. (잠재적으로 "안전한"상태는 아니지만 여기서는 문제가되지 않는다고 생각합니다.)

마지막 작업 만 오류 메시지가 연결 / 문마다 저장되므로 사용자에 대한 정보가 손실 될 수 있습니다 어떤 문제가 발생했습니다 후 계속하면 오류가 발생합니다. 이 정보를 사용하여 스크립트가 다시 시도할지 (일시적인 문제 만 해당), 무언가를 변경할지, 아니면 완전히 구제를할지 (그리고 버그를보고할지) 결정할 수 있습니다. 그리고 디버깅이 훨씬 쉬워집니다.

$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();

edit: just a few notes six years later....
The mysqli extension is perfectly capable of reporting operations that result in an (mysqli) error code other than 0 via exceptions, see mysqli_driver::$report_mode.
die() is really, really crude and I wouldn't use it even for examples like this one anymore.
So please, only take away the fact that each and every (mysql) operation can fail for a number of reasons; even if the exact same thing went well a thousand times before....


Completeness

You need to check both $mysqli and $statement. If they are false, you need to output $mysqli->error or $statement->error respectively.

Efficiency

For simple scripts that may terminate, I use simple one-liners that trigger a PHP error with the message. For a more complex application, an error warning system should be activated instead, for example by throwing an exception.

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
}

Not sure if this answers your question or not. Sorry if not

To get the error reported from the mysql database about your query you need to use your connection object as the focus.

so:

echo $mysqliDatabaseConnection->error

would echo the error being sent from mysql about your query.

Hope that helps

참고URL : https://stackoverflow.com/questions/2552545/mysqli-prepared-statements-error-reporting

반응형