我正在尝试调试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'
我的查询背后的逻辑是,它找到x
和y
的所有组合,获取相应的$popDen
值,并将其添加到$result
。结果在我的脚本开始时定义,并在此循环后由程序返回。
我知道问题部分是我的while循环,但我不太明白如何解决它,因为我不完全理解mysql_fetch_array
的功能。我也尝试了mysql_fetch_row
,我的查询也无效。
我知道通过评论代码的各个块,并传回其他所有其他工作的数字;只是这个块失败了。
我是否有任何明显的错误?
答案 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?
并且不要忘记始终将动态表名包含在反引号`
中,否则如果您碰巧使用保留字或数字作为表或列名,您的代码就会中断。