Почему использование оператора If меняет переменную? - PullRequest
1 голос
/ 21 июля 2010

Я читаю текстовый файл и обрабатываю некоторые записи, соответствующий образец текстового файла:

#export_dategenre_idapplication_idis_primary
#primaryKey:genre_idapplication_id
#dbTypes:BIGINTINTEGERINTEGERBOOLEAN
#exportMode:FULL
127667880285760063715151750
127667880285760123715151751

Я хочу выполнить определенное действие, когда application_id уже сохранен в моей базе данных AND is_primary = 1

Я написал этот PHP, чтобы проверить мой код:

$fp1 = fopen('genre_application','r');
if (!$fp) {echo 'ERROR: Unable to open file.'; exit;}


while (!feof($fp1)) {
    $line = stream_get_line($fp1,128,$eoldelimiter); //use 2048 if very long lines
if ($line[0] === '#') continue;  //Skip lines that start with # 
    $field = explode ($delimiter, $line);
list($export_date, $genre_id, $application_id, $is_primary ) = explode($delimiter, $line);

// does application_id exist? 
$application_id = mysql_real_escape_string($application_id); 
$query = "SELECT * FROM jos_mt_links WHERE link_id='$application_id';"; 
$res = mysql_query($query); 
if (mysql_num_rows($res) > 0 ) { 
echo $application_id . "application id has genre_id" . $genre_id . "with primary of " . $is_primary. "\n";
} else 
{
// no, application_id doesn't exist 
}

} //close reading of genre_application file
fclose($fp1);

, который приводит к выводу на экран и в точности соответствует ожиданиям.

371515175application id has genre_id6006with primary of 0

371515175application id has genre_id6012with primary of 1

Если я тогдадобавьте оператор IF, как в приведенном ниже коде, он каким-то образом изменит значение is_primary, как показано на экранном дисплее

$fp1 = fopen('genre_application','r');
if (!$fp) {echo 'ERROR: Unable to open file.'; exit;}


while (!feof($fp1)) {
    $line = stream_get_line($fp1,128,$eoldelimiter); //use 2048 if very long lines
if ($line[0] === '#') continue;  //Skip lines that start with # 
    $field = explode ($delimiter, $line);
list($export_date, $genre_id, $application_id, $is_primary ) = explode($delimiter, $line);

// does application_id exist? 
$application_id = mysql_real_escape_string($application_id); 
$query = "SELECT * FROM jos_mt_links WHERE link_id='$application_id';"; 
$res = mysql_query($query); 
if (mysql_num_rows($res) > 0 ) { 
if ($is_primary = '1')  echo $application_id . "application id has genre_id" . $genre_id . "with primary of " . $is_primary. "\n";
} else 
{
// no, application_id doesn't exist 
}

} //close reading of genre_application file
fclose($fp1);
?>

Приведенный выше код приводит к следующему экранному экрану, на котором неправильно отображается первое поле сосновной из 1, когда, как видно из предыдущего экрана и образца текстового файла, это должно быть 0

371515175application id has genre_id6006with primary of 1

371515175application id has genre_id6012with primary of 1

Может кто-нибудь объяснить, что я делаю, чтобы сделать изменение переменной и как я должен использоватьЕсли правильно, пожалуйста?

Ответы [ 7 ]

7 голосов
/ 21 июля 2010

Вы присваиваете значение вместо сравнения:

($is_primary = '1')

вам нужно

($is_primary == '1')

или === для сравнения типов.

Вот почему некоторые люди любят писать свои сравнения следующим образом:

('1' == $is_primary)

ошибка невозможнасделайте здесь, потому что «1» ничего не может быть назначено.

Лично я думаю, что со временем и с ростом практики, вы научитесь определять ошибку.

2 голосов
/ 21 июля 2010

Вам необходимо использовать:

if ($is_primary == '1')

НЕ

if ($is_primary = '1')

Поскольку "=" определяет переменную и возвращает true, но "==" фактически сравнивает и ничего не меняет.

1 голос
/ 21 июля 2010

if ($ is_primary = '1') Вам нужно использовать оператор сравнения ==, а не оператор присваивания =

1 голос
/ 21 июля 2010

В строке if есть только одна = (назначаемое значение) вместо двух == (сравнительное значение).

Попробуйте вместо этого:

if ($is_primary == '1')
0 голосов
/ 21 июля 2010
0 голосов
/ 21 июля 2010

Если вы наберете if ($ x = 10) ...

Затем вы скажете ему попробовать выполнить операцию $ x = 10, которой он вернет успех (верните true).Это всегда будет запускать цикл и изменять значение x.

На test $ x, используйте if ($ x == 10) ...

Нообратите внимание, что для проверки $ x не равно 10, если ($ x! = 10) ...

т. е. один равен и один удар.

0 голосов
/ 21 июля 2010

if ($ is_primary == '1') ....

НЕ = НО ==

Также рассмотрите возможность удаления всего, что мешает чтению вашего вопроса, например, что-то вроде:

// does application_id exist? 
$res = mysql_query($query); 
if (mysql_num_rows($res) > 0 ) { 
    echo  $is_primary. "\n";
} 

Это более читабельно и соответствует вашим целям. Вы даже можете обнаружить, что делаете ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...