2011-01-20 97 views
1

我试着调试MySQL查询,我也很难理解为什么一个while循环在我的脚本不能正常工作:问题与MySQL查询

// 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。结果在我的脚本开始处定义,并在此循环后由程序返回。

我知道这个问题部分是我的,而循环,但我不太明白如何修复它,因为我不完全了解mysql_fetch_array功能。我也试过mysql_fetch_row,我的查询也不能用于这个。

我从注释掉的代码块不同,并传回其他数字,其他一切工作的认识;这只是失败的大块。

有没有,我做任何明显的错误?

+0

你能说清楚你在用$ popDen变量做什么吗?另外我会用最后一个循环的每个语法,因为这似乎模仿你期望更好。 – Bnjmn 2011-01-20 01:21:23

+0

$ popDen包含一个字符串,它是一个列名。我只希望能够返回一个值;我是新来的语法,不知道什么是最好的使用。 – djq 2011-01-20 01:28:59

回答

3

如果popDen是表中的列,您需要获得它:

$tmpResult = $row['popDen']; 

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

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

编辑:顺便说一下,您可能想要初始化您的$result变量,以便如果没有找到行时它具有已定义/有效/已知值。

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?
不要忘记始终将动态表名在反引号`,或者如果你碰巧使用保留字或编号为表或列代码将打破名称。