如何不显示 SQL 准备语句错误 [重复]

How to not show SQL prepare statement errors [duplicate]

提问人:JeanneMeoy 提问时间:9/2/2022 最后编辑:JeanneMeoy 更新时间:9/2/2022 访问量:42

问:

我有一个表单,用于向用户添加新的监视。为此,我将 prepare 语句与 mysqli 一起使用。

mysqli 代码:

function addMonitoring( mysqli $db, string $date, int $time, int $num_user, int $num_action, string $remark ): int
{
    if(
        $stmt = $db->prepare( 'INSERT INTO monitoring (
                                                       `date`,
                                                       `time`, 
                                                       `num_user`, 
                                                       `num_action`,
                                                       `remark`
                                                      )
                                               VALUES ( ?, ?, ?, ?, ? )
                              ')
    ) {      
        $stmt->bind_param( 'siiis', $date, $time, $num_user, $num_action, $remark );
        $stmt->execute();
        $stmt->close();
        if(
            $stmt = $db->prepare( 'SELECT m.id FROM monitoring m ORDER BY m.id DESC LIMIT 1')
        )
        {
            $stmt->execute();
            $stmt->store_result();
            $stmt->bind_result( $id );
            if( $stmt->fetch() ) {
                return $id;
            }
            $stmt->close();
        }
    }
    return 0;
}

我尝试显示测试错误,所以我在我的$time变量中放置了一个字符串类型,我想知道如何不显示此处看到的错误消息:

错误前的照片

出现类似“发生错误”的消息

出错时拍照

视图中用于添加监视的代码

if( isset( $_POST['add'] ) ) {
    // dd($_POST);
    addMonitoring( $db, $_POST['date'], $_POST['time'], $_POST['num_user'], $_POST['action'], $_POST['remark'] );
    redirect( '/user/?num_user='.$_POST['num_user'] );
}

例如,如果我不使用准备好的语句,我这样做:

$query  = "INSERT INTO monitoring (
                                                       `date`,
                                                       `time`, 
                                                       `num_user`, 
                                                       `num_action`,
                                                       `remark`
                                                      )
                                               VALUES ( $date, $time, $num_user, $num_action, $remark )"
    $result = mysqli_query( $db, $query );
    $query  = "SELECT m.id FROM monitoring m ORDER BY m.id DESC LIMIT 1";
    
    $result = mysqli_query( $db, $query );
    return ( !( $result === false ) && ( $row = mysqli_fetch_row( $result ) ) )?$row[0]:0;

如果mysql遇到问题,我可以返回int或0,因此如果我有“0”,我可以显示自定义消息

php mysqli 预备语句

评论

0赞 Your Common Sense 9/2/2022
查看您的问题的详细答案 phpdelusions.net/articles/error_reporting
0赞 JeanneMeoy 9/2/2022
@YourCommonSense,它没有回答我的问题,因为这个解决方案向我们展示了如何显示自定义致命错误,在这里我只想显示一条自定义消息,并“重置”页面。因为错误只是一个错误的类型(string to int)。但感谢您的信息!
1赞 Your Common Sense 9/2/2022
什么是“重置”?为什么你的问题中没有提到它?当它完全按照要求执行操作时,它如何“不回答”,显示“像'发生错误'这样的消息”?什么是“坏类型”?您的问题询问有关“SQL 准备语句错误”的问题。我想你还没有下定决心,这使你的问题偏离了主题。
0赞 Your Common Sense 9/2/2022
关于您最近的添加,在发生致命错误时返回 0 是错误的。仅当查询未返回任何行时,才返回 0。
1赞 Your Common Sense 9/2/2022
就目前而言,答案是存在的。对于无法预见的错误,错误处理程序必须逐步执行该错误,并显示一般错误消息,无论是类型错误还是数据库错误。如果您的问题是如何防止不正确的用户输入,那么您必须对其进行验证,并显示您喜欢的任何自定义消息。喜欢if (!ctype_digit($time)) echo "Time must be numeric"

答:

-1赞 prashant 9/2/2022 #1

可以使用异常处理来实现它。

如果要向用户显示可读的错误消息,则可以尝试对代码进行以下更改。

function addMonitoring( mysqli $db, string $date, int $time, int $num_user, int $num_action, string $remark ): int
{
    try {
        if(
            $stmt = $db->prepare( 'INSERT INTO monitoring (
                                                           `date`,
                                                           `time`, 
                                                           `num_user`, 
                                                           `num_action`,
                                                           `remark`
                                                          )
                                                   VALUES ( ?, ?, ?, ?, ? )
                                  ')
        ) {      
            $stmt->bind_param( 'siiis', $date, $time, $num_user, $num_action, $remark );
            $stmt->execute();
            $stmt->close();
            if(
                $stmt = $db->prepare( 'SELECT m.id FROM monitoring m ORDER BY m.id DESC LIMIT 1')
            ) {
                $stmt->execute();
                $stmt->store_result();
                $stmt->bind_result( $id );
                if( $stmt->fetch() ) {
                    return $id;
                }
                $stmt->close();
            }
        }
    } catch (Exception $e) {
        // If you don't want to handle exception then keep it empty. 
        // But its better to handle exception
        echo $e->getMessage(); 
    }
    
    return 0;
}

评论

0赞 JeanneMeoy 9/2/2022
它不起作用,我仍然有一个带有sql错误的空白页,我编辑了我的代码以在添加监视的视图上显示代码
0赞 Dharman 9/3/2022
这是一个相当无用的建议。PHP 将显示错误消息或正确记录它,而无需 try-catch。无论哪种方式,如果语句都不是必需的。