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

Php 在生产环境中处理准备好的语句时出错,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,在生产环境中,当使用准备好的语句并完成所有其他验证时,我是否需要对每一步都进行错误检查,还是只需检查$stmt的最终结果是否正确 我正试图清理一个函数文件的大约2000行,当已经完成了这么多验证(即检查空值、必需值、空字段等)时,其中的很多看起来像是浪费了空间 这里是一个粗略的,非常简单的例子,我想做什么 $sql = "SELECT count(*) FROM foo WHERE somecol = ?"; $stmt = $conn->prepare($sql); $stmt->

在生产环境中,当使用准备好的语句并完成所有其他验证时,我是否需要对每一步都进行错误检查,还是只需检查
$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
之前已经检查过。

您必须决定是否有必要在您的情况下使用它。但是一些程序员会说,捕捉错误的代码几乎和普通代码一样

简而言之:如果可能出现错误,请捕获它;)

否则,我建议您为DB函数创建一个包装器类

仅举一个小例子为您指出正确的方向:

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 

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

为了获得更好的用户体验,您应该执行所有检查并向用户显示相关的错误消息。一般消息会让用户感到困惑,让他很难理解发送表单时发生了什么。一般消息是“有一个数据库错误,请再试一次”,除此之外,我认为他们不需要任何与查询失败原因相关的信息,任何可能由最终用户引起的错误之前都已经处理过。这肯定是下一次编辑的工作。我已经在noggin中滚动了几周,但时间限制是一个问题,我的技能还不够先进,无法及时完成。话虽如此,我刚刚完成的错误处理课程将让我知道是否真的出了什么问题,即使服务器在喝了很多啤酒后凌晨2点打嗝……哈哈,所以我认为我暂时是安全的,但类似的东西在下一次编辑的列表顶部。很高兴听到并思考“你不必重新发明轮子”github上有很多好的、小的和维护良好的包装器类;)这是真的,但是,对我来说,如果需要的话,仅仅使用一些东西从来不会教我如何编写和调试它,所以虽然我将使用它们作为参考,但我仍然可能编写自己的包装器类。