views:

92

answers:

7

I am reading a text file and processing some records, a relevant sample of the text file is

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

I want to perform a specific action when application_id is already stored within my database AND is_primary = 1

I wrote this PHP to test my code:

$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);

which results in this output on screen and is exactly as I expected.

371515175application id has genre_id6006with primary of 0

371515175application id has genre_id6012with primary of 1

If I then add an IF statement as in the code below, it somehow changes the value of is_primary as shown by the screen display

$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);
?>

The code above results in the following screen display, which incorrectly has the first field with a primary of 1, when as can be seen by the previous screen display and the sample text file it should be 0

371515175application id has genre_id6006with primary of 1

371515175application id has genre_id6012with primary of 1

Can anyone explain what I am doing to make the variable change and how I should use the If correctly please?

+2  A: 

You need to use:

if ($is_primary == '1')

NOT

if ($is_primary = '1')

Because "=" defines variable and returns true, but "==" actually compares and doesn't change anything.

Māris Kiseļovs
+7  A: 

You are assigning a value instead of comparing:

($is_primary = '1')

you need

($is_primary == '1')

or === for a type-safe comparison.

This is why some people like to write their comparisons like so:

('1' == $is_primary)

the mistake is impossible to make here because "1" can't be assigned anything.

Personally though, I think that over time and with growing practice, one will learn to spot the mistake.

Pekka
A: 

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

NOT = BUT ==

Also consider removing all the stuff that bug the reading of your question for example somthing like:

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

This is more readable and fit you purpose. You may even find yourself does kind of bug.

mathk
+1  A: 

The if-line has only one = (assign value) instead of two == (compare value).

Try this instead:

if ($is_primary == '1')
Veger
+1  A: 

if ($is_primary = '1') You need to use the comparison operator ==, not the assignment operator =

Rab
A: 

If you type if($x=10)...

Then you're telling it to attempt the operation $x=10 to which it will return a success (return true). This will always run the loop, and alter the value of x.

To test $x, use if($x==10)...

But note that to test for $x not equals 10 is if($x!=10)...

ie, one equals and one bang.

Richeh
A: 

Chek out PHP comparison operators

Breign