MySQL查询问题

时间:2011-01-20 01:15:43

标签: php mysql

我正在尝试调试MySQL查询,但我无法理解为什么我的脚本中的while循环无效:

// select db
mysql_select_db($dbname);

for ( $x = $latRange[0]; $x <= $latRange[1]; $x++ )
{

   for ( $y = $lngRange[0]; $y <= $lngRange[1]; $y++)
   {
    $sql="SELECT * FROM $usertable WHERE $xlookup = $x AND $ylookup = $y";

  $SQLresult = mysql_query($sql);

  while( $row = mysql_fetch_array($SQLresult) )    
    {       
       $tmpResult = $row[$popDen];                  
                     $result += $tmpResult;   
    }


 }

}

所描述变量的样本值为:

 $latRange = array(3,7);
 $lngRange = array(9,25);
 $popDen = 'ColumnNameIWant'
 $xlookup = 'Col1'
 $xlookup = 'Col2'

我的查询背后的逻辑是,它找到xy的所有组合,获取相应的$popDen值,并将其添加到$result。结果在我的脚本开始时定义,并在此循环后由程序返回。

我知道问题部分是我的while循环,但我不太明白如何解决它,因为我不完全理解mysql_fetch_array的功能。我也尝试了mysql_fetch_row,我的查询也无效。

我知道通过评论代码的各个块,并传回其他所有其他工作的数字;只是这个块失败了。

我是否有任何明显的错误?

2 个答案:

答案 0 :(得分:3)

如果popDen是表格中的列,则需要使用以下内容:

$tmpResult = $row['popDen'];

如果它是您需要的唯一值,您可以简化/加速您的SQL查询:

$sql="SELECT `popDen` FROM $usertable WHERE $xlookup = $i AND $ylookup = $y";

编辑顺便说一句,您可能希望初始化$result变量,以便在没有找到行时它具有已定义/有效/已知值。

答案 1 :(得分:0)

一个明显的错误是使用动态表名 这使得很难关闭SQL注入漏洞:

使用此代码插入该漏洞,因为mysql-real_escape_string()无效!

$allowed_tables = array('table1', 'table2');
$clas = $_POST['clas'];
if (in_array($clas, $allowed_tables)) {
    $query = "SELECT * FROM `$clas`";
}

有关详细信息,请参阅此处:How to prevent SQL injection with dynamic tablenames?
并且不要忘记始终将动态表名包含在反引号`中,否则如果您碰巧使用保留字或数字作为表或列名,您的代码就会中断。