在生产环境中处理准备好的语句时出错

Error handling prepared statements in a production environment

在生产环境中,当使用准备好的语句并完成所有其他验证时,我是否需要对每个步骤进行错误检查,或者我是否可以只检查 $stmt 的最终结果是真还是假?

我正在尝试清理一个函数文件的大约 2000 行,当已经完成大量验证(即检查空值、所需值、空字段等)。

这是我想做的粗略、极其简单的示例。

$sql = "SELECT count(*) FROM foo WHERE somecol = ?";

$stmt = $conn->prepare($sql);
$stmt->bind_param("s",$value);
$stmt->execute();

$stmt->bind_result($c);
$stmt->fetch();

if(false === $stmt){
    //My error report
    trigger_error("Something bad happened!" );
    //Error user sees
    $userErrorMsg[] 'Some generic msg here';
}

编辑: 我可能应该提到 $conn 之前已经检查过了。

您必须决定在您的情况下是否有必要。但是有些程序员会说,捕获错误的代码几乎和正常代码一样。

简而言之:如果有错误CATCH IT ;)

否则我会建议您为您的数据库函数创建一个包装器 class。

只是一个小例子,可以为您指明正确的方向:

class MyDBClass {
    private static $con = null;
    private static $instance = null;

    public static function getInstance() {
        if( null === self::$instance) {
            // add error handling ;)
            self::$instance = new MyDBClass();
            self::$instance->setConnection();
        }

        return self::$instance;
    }

    private function setConnection() {
        if( null === self::$con) {
            // add error handling ;)
            self::$con = mysqli_connect("localhost","my_user","my_password","my_db");
        }
    }

    private function __construct() {}

    public function select( $tableName, $columns = "*", $conditions = array(), $numRows = null ) {
        // add your stuff with error handling
    }

    public function selectRow( $tableName, $columns = "*" , $conditions = array() ) {
        // add your stuff with error handling
    }
}

// use of class
$db = MyDBClass::getInstance();
$db->select( "mytable" );// would (for example) select * from mytable 

注意:这不是一个有效的例子,我建议使用一个好的框架或一个小的包装器class