SQL 错误还是其他?

SQL bug or something else?

我用Joomla做了一个简单的业余组件...

里面有一个select>选项下拉列表,可以给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"]."'";

table 列 Power 的类型为 float 或 double。在您的第一个查询中,您尝试插入一个字符串值。第二个查询通过首先将请求值转换为浮点数并删除该值两边的引号来插入正确的浮点数。

顺便说一下,您永远不会在 sql 查询中使用未经过滤的用户输入(例如 $_GET 值)。

如果您使用的是 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 前缀,假设您已经遵循了这种方法。如果不是,只需将 #__table 替换为您的 table

的全名

其实过了几天发现问题和解决方法都比较简单

只需删除 '- 符号即可解决问题

 Power='".$_GET["Power"]."'

 Power=".$_GET["Power"]."

此致