这个funcphp有什么问题

我在 PHP 中编写了这个函数来查询数据库,如果我在查询中手动输入人员 ID 04033 如下,它工作得很好......

function getReportByID(PDO $pdo){
    $query = "SELECT users.staff_ID, users.Name, reports.id_report_show, reports.date_report 
                FROM `users`
                    JOIN reports ON reports.staff_ID = users.staff_ID
                where users.staff_ID = 04033";
    
    $st = $pdo->prepare($query);
    $st->execute();
    $result = $st->fetchAll();
    
    
    if (count($result) == 0) {
       print_r('no result');
    } else {
    
      print_r($result);
    } 

}



但是如果我在查询中使用变量 $staff_ID 它不会找到任何东西。

function getReportByID(int $staff_ID, PDO $pdo){
    $query = "SELECT users.staff_ID, users.Name, reports.id_report_show, reports.date_report 
                FROM `users`
                    JOIN reports ON reports.staff_ID = users.staff_ID
                where users.staff_ID = $staff_ID";

    $st = $pdo->prepare($query);
    $st->execute();
    $result = $st->fetchAll();
    
    
    if (count($result) == 0) {
       print_r('no result');
    } else {
    
      print_r($result);
    } 

}

getReportByID(04033,$pdo);

我做错了什么?(真的是PHP和sql的初学者)

谢谢

回答

在 PHP 中,04033 是八进制的(参见https://www.php.net/manual/en/language.types.integer.php)。

这意味着:

getReportByID(04033,$pdo);

实际上是传递这个十进制值:

getReportByID(2075,$pdo);

但是在 MySQL 中,带有前导零的数字文字不会被解释为八进制数。所以 04033 只是十进制的 4033。这就是当您将数字按字面意思放入 SQL 查询时它起作用的原因。


解决方案:使用字符串,而不是整数。并且请使用查询参数来防止 SQL 注入漏洞。

function getReportByID($staff_ID, PDO $pdo){
    $query = "SELECT users.staff_ID, users.Name, reports.id_report_show, reports.date_report 
                FROM `users`
                    JOIN reports ON reports.staff_ID = users.staff_ID
                where users.staff_ID = ?";

    $st = $pdo->prepare($query);
    $st->execute( [ $staff_ID ] );
    $result = $st->fetchAll();
    
    
    if (count($result) == 0) {
       print_r('no result');
    } else {
    
      print_r($result);
    } 

}

getReportByID("04033",$pdo);


以上是这个funcphp有什么问题的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>