这个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);