[英]Failing to execute dynamic query
我正在嘗試使用動態查詢從 Moodle 中的數據庫中獲取數據,但我告訴我讀取數據庫時出錯:
$parts = $_POST['make'];
$arr = explode(':', $parts);
$sql = "SELECT mdl_block_report_bbb_meeting.id,
mdl_block_report_bbb_meeting.name,
mdl_block_report_bbb_meeting.create_time,
mdl_block_report_bbb_meeting.end_time,
mdl_block_report_bbb_user_events.id as ueid,
mdl_block_report_bbb_user_events.name as uename,
mdl_block_report_bbb_user_events.join_time,
mdl_block_report_bbb_user_events.left_time
FROM mdl_block_report_bbb_meeting
JOIN mdl_block_report_bbb_user_events
ON mdl_block_report_bbb_meeting.id =
mdl_block_report_bbb_user_events.meeting_id
WHERE uename LIKE '%$arr%'";
$result = $DB->get_records_sql($sql);
我究竟做錯了什么?
永遠不要直接使用$_POST
,它允許 SQL 注入。
使用optional_param
或required_param
來清理數據。
$parts = required_param('make', PARAM_TEXT);
$arr = explode(':', $parts);
$arr
現在包含一個不能與LIKE
一起使用的數組。
你可能想用這個
list($where, $params) = $DB->get_in_or_equal($arr, SQL_PARAMS_NAMED, 'uename');
在您的 SQL 中使用別名使其更易於閱讀和輸入。
也不要使用“mdl”,表前綴是一個可以更改的設置,所以在表名周圍使用{}括號。
$sql = "SELECT m.id,
m.name,
m.create_time,
m.end_time,
ue.id as ueid,
ue.name as uename,
ue.join_time,
ue.left_time
FROM {block_report_bbb_meeting} m
JOIN {block_report_bbb_user_events} ue ON ue.meeting_id = m.id
WHERE ue.name {$where}";
// Always pass the values as params, again to avoid injection.
$result = $DB->get_records_sql($sql, $params);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.