2011-01-20 5 views
1

Я пытаюсь отладить запрос MySQL, и у меня есть проблемы с пониманием, почему один цикл, а в моем сценарии не работает:Проблема с запросом 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' 

логика моего запроса является то, что он находит все комбинации x и y, получает соответствующее $popDen значение, и добавляет его в $result. Результат определяется в начале моего скрипта и возвращается программой после этого цикла.

Я знаю, что раздел проблем - это мой цикл while, но я не совсем понимаю, как это исправить, поскольку я не совсем понимаю, как работают функции mysql_fetch_array. Я также пробовал mysql_fetch_row, и мой запрос тоже не работает.

Я знаю, комментируя различные фрагменты кода и передавая другие числа, что все работает; это просто этот кусок, который терпит неудачу.

Есть ли очевидные ошибки, которые я делаю?

+0

Не могли бы вы пояснить, что вы делаете с переменной $ popDen? Кроме того, я бы использовал для каждого синтаксиса для заключительного цикла, поскольку это похоже на то, что вы ожидаете лучше. – Bnjmn

+0

$ popDen содержит строку, которая является именем столбца. Я ожидаю, что одна ценность будет возвращена; Я новичок в синтаксисе и не уверен, что лучше всего использовать. – djq

+3

Существуют ли $ xlookup и $ ylookup в любом месте? Вы не проверяете, удалось ли выполнить вызов. Если это плохо, тогда остальная часть кода тоже взорвется. по крайней мере, mysql_query (..) или die (mysql_error()) 'как метод отладки в секундах. –

ответ

3

Если popDen столбец в таблице, вам необходимо получить его:

$tmpResult = $row['popDen']; 

и если это единственное значение, вам нужно, вы можете упростить/ускорить ваш SQL-запрос:

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

Редактировать: Кстати, вы можете инициализировать переменную $result так, чтобы она имела определенное/действительное/известное значение, если строки не найдены.

+0

Спасибо за ответ - это помогло мне очистить мой код и решить мою проблему. Я инициализировал $ result, но я искал его так плохо, что скрипт терпел неудачу. – djq

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?
И не забывайте всегда заключать динамические tablenames в обратных кавычках ` или код сломается, если вы решили использовать зарезервированное слово или номер для таблицы или столбца имя.

Смежные вопросы