我在Joomla做了一个简单的业余组件......
其中有一个选择>选项下拉列表,可以在URL中添加参数。
问题在于它没有使用1.1值,它的工作价值为1.5。
我的一位朋友解决了这个问题,但我想知道它为什么会发生
原始查询:
$query = "SELECT * FROM `TABLE 2` WHERE Power='".$_GET["Power"]."' AND Poles='".$_GET["Poles"]."'";
新的工作查询:
$query = "SELECT * FROM `TABLE 2` WHERE Power=".floatval($_GET["Power"])." AND Poles='".$_GET["Poles"]."'";
答案 0 :(得分:0)
表列Power的类型为float或double。在第一个查询中,您尝试插入字符串值。第二个查询通过首先将请求值转换为float并删除值周围的引号来插入正确的float。
顺便说一下,你永远不会在sql查询中使用未经过滤的用户输入(例如$ _GET值)。
答案 1 :(得分:0)
如果您正在使用Joomla,那么您应该坚持使用Joomla的所有编码标准和方法,包括数据库查询:
https://docs.joomla.org/Selecting_data_using_JDatabase
您还应该使用JInput
代替$_POST
或$_GET
来电:
http://docs.joomla.org/Retrieving_request_data_using_JInput
查看您的查询,它应该看起来像这样:
$db = JFactory::getDbo();
$input = JFactory::getApplication()->input;
$power = $input->get('Power', '', 'RAW');
$polls = $input->get('Pols', '', 'RAW');
$query = $db->getQuery(true);
$query->select($db->qn(array('*')))
->from($db->qn('#__table'))
->where($db->qn('Power') . ' = ' . $db->q($power), 'AND')
->where($db->qn('Polls') . ' = ' . $db->q($polls));
$db->setQuery($query);
$results = $db->loadObjectList();
// Do what you want with the $results object
使用这意味着列名称和数据值可以正确转义,并且您没有像@ skidr0w所提到的那样留下SQL漏洞。
注意: #__
是数据库表前缀,假设您已遵循此方法。如果没有,只需使用表格的全名替换#__table
答案 2 :(得分:-1)
实际上,经过几天我发现问题和解决方案更简单。
删除'-sign解决了问题
Power='".$_GET["Power"]."'
带
Power=".$_GET["Power"]."
此致