【问题标题】:Failing to execute dynamic query执行动态查询失败
【发布时间】:2021-11-06 01:07:18
【问题描述】:

我正在尝试使用动态查询从 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);

我做错了什么?

【问题讨论】:

    标签: php mysql sql database moodle


    【解决方案1】:

    永远不要直接使用$_POST,它允许SQL注入。

    使用optional_paramrequired_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);
    

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 2023-03-18
      • 1970-01-01
      • 2016-08-06
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多