By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
457,727 Members | 1,268 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 457,727 IT Pros & Developers. It's quick & easy.

What's wrong the the logic in this code?

P: n/a
Greetings:

I am attempting to get conditional output based on POSTed form data.
If the posted value is either the key or value of an array, $x=key and
$q=foo. elseif it is neither key nor value(I tried || too) , $q=bar.
Even though $x is properly assigned the new value, $q always ends up
being bar. Abstractions aside, here's the code: (note ## comments
added to this post)

<snip>
$search = $_POST[search];
$sort = $_POST[sortby];
$states = array(
"AL" ="Alabama",
"AK" ="Alaska",
"AZ" ="Arizona",
...
);
##echo $search here outputs the POSTed input
foreach ($states as $key =$value)

if ($search == $value || $search == $key) {
$search = $key;
##echo $search here outputs the new value, when applicable
$q = "
SELECT
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR organization.org_id = 0
WHERE organization.state
= '$search'
OR contacts.state
= '$search'
ORDER BY '$sort' ASC";

} elseif ($search != $value && $search != $key) { ##I tried || here too.
##echo $search here outputs the new value too, when applicable
$q = "
SELECT
CONCAT(contacts.firstname,' ',contacts.lastname) AS fullname,
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR organization.org_id = 0
WHERE organization.state
LIKE '%$search%'
OR organization.orgname
LIKE '%$search%'
OR contacts.state
LIKE '%$search%'
OR contacts.lastname
LIKE '%$search%'
OR contacts.firstname
LIKE '%$search%'
ORDER BY '$sort' ASC";
}

$result = mysql_query($q)
or die('Query Failed: ' . mysql_error());
</snip>

Where is this evaluation breaking down and why? Thanks in advance.
--

Regards,

Jeff Gardner
___________________________

"Contrary to popular belief, Unix is user friendly. It just happens
to be very selective about who its friends are." --Kyle Hearn
Sep 15 '06 #1
Share this Question
Share on Google+
6 Replies


P: n/a
"Jeff Gardner" <us**@example.tldwrote in message
news:FN***************@newssvr11.news.prodigy.com. ..
Greetings:

I am attempting to get conditional output based on POSTed form data.
If the posted value is either the key or value of an array, $x=key and
$q=foo. elseif it is neither key nor value(I tried || too) , $q=bar.
Even though $x is properly assigned the new value, $q always ends up
being bar. Abstractions aside, here's the code: (note ## comments
added to this post)

<snip>
$search = $_POST[search];
$sort = $_POST[sortby];
$states = array(
"AL" ="Alabama",
"AK" ="Alaska",
"AZ" ="Arizona",
...
);
##echo $search here outputs the POSTed input
foreach ($states as $key =$value)

if ($search == $value || $search == $key) {
$search = $key;
##echo $search here outputs the new value, when applicable
$q = "
SELECT
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR organization.org_id = 0
WHERE organization.state
= '$search'
OR contacts.state
= '$search'
ORDER BY '$sort' ASC";

} elseif ($search != $value && $search != $key) { ##I tried || here too.
##echo $search here outputs the new value too, when applicable
$q = "
SELECT
CONCAT(contacts.firstname,' ',contacts.lastname) AS fullname,
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR organization.org_id = 0
WHERE organization.state
LIKE '%$search%'
OR organization.orgname
LIKE '%$search%'
OR contacts.state
LIKE '%$search%'
OR contacts.lastname
LIKE '%$search%'
OR contacts.firstname
LIKE '%$search%'
ORDER BY '$sort' ASC";
}

$result = mysql_query($q)
or die('Query Failed: ' . mysql_error());
</snip>

Where is this evaluation breaking down and why? Thanks in advance.
--

Regards,

Jeff Gardner
Instead of the elseif you could just use else. Why check again, it's either
a state value, or something else.

Hans
Sep 15 '06 #2

P: n/a
Hans 'pritaeas' Pollaerts wrote:
"Jeff Gardner" <us**@example.tldwrote in message
news:FN***************@newssvr11.news.prodigy.com. ..
>Greetings:

I am attempting to get conditional output based on POSTed form data.
If the posted value is either the key or value of an array, $x=key and
$q=foo. elseif it is neither key nor value(I tried || too) , $q=bar.
Even though $x is properly assigned the new value, $q always ends up
being bar. Abstractions aside, here's the code: (note ## comments
added to this post)

<snip>
$search = $_POST[search];
$sort = $_POST[sortby];
$states = array(
"AL" ="Alabama",
"AK" ="Alaska",
"AZ" ="Arizona",
...
);
##echo $search here outputs the POSTed input
foreach ($states as $key =$value)

if ($search == $value || $search == $key) {
$search = $key;
##echo $search here outputs the new value, when applicable
$q = "
SELECT
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR organization.org_id = 0
WHERE organization.state
= '$search'
OR contacts.state
= '$search'
ORDER BY '$sort' ASC";

} elseif ($search != $value && $search != $key) { ##I tried || here too.
##echo $search here outputs the new value too, when applicable
$q = "
SELECT
CONCAT(contacts.firstname,' ',contacts.lastname) AS fullname,
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR organization.org_id = 0
WHERE organization.state
LIKE '%$search%'
OR organization.orgname
LIKE '%$search%'
OR contacts.state
LIKE '%$search%'
OR contacts.lastname
LIKE '%$search%'
OR contacts.firstname
LIKE '%$search%'
ORDER BY '$sort' ASC";
}

$result = mysql_query($q)
or die('Query Failed: ' . mysql_error());
</snip>

Where is this evaluation breaking down and why? Thanks in advance.
--

Regards,

Jeff Gardner

Instead of the elseif you could just use else. Why check again, it's either
a state value, or something else.

Hans

I added the elsif because I get the same output with an else. That's
why I suspect that there is a logic problem. For some reason, the second
$q variable is populated regardless of the previous conditional
statement being satisfied or not. If a state is not input, $search
remains untouched and the 2nd $q is populated as expected. If a state
is input, $search is modified but the 2nd $q is still populated.

--

Regards,

Jeff Gardner
___________________________

"Contrary to popular belief, Unix is user friendly. It just happens
to be very selective about who its friends are." --Kyle Hearn
Sep 15 '06 #3

P: n/a
Jeff Gardner wrote:
Greetings:

I am attempting to get conditional output based on POSTed form data.
If the posted value is either the key or value of an array, $x=key and
$q=foo. elseif it is neither key nor value(I tried || too) , $q=bar.
Even though $x is properly assigned the new value, $q always ends up
being bar. Abstractions aside, here's the code: (note ## comments
added to this post)

<snip>
$search = $_POST[search];
$sort = $_POST[sortby];
$states = array(
"AL" ="Alabama",
"AK" ="Alaska",
"AZ" ="Arizona",
...
);
##echo $search here outputs the POSTed input
foreach ($states as $key =$value)

if ($search == $value || $search == $key) {
$search = $key;
##echo $search here outputs the new value, when applicable
$q = "
SELECT
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR organization.org_id = 0
WHERE organization.state
= '$search'
OR contacts.state
= '$search'
ORDER BY '$sort' ASC";

} elseif ($search != $value && $search != $key) { ##I tried || here too.
##echo $search here outputs the new value too, when applicable
$q = "
SELECT
CONCAT(contacts.firstname,' ',contacts.lastname) AS fullname,
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR organization.org_id = 0
WHERE organization.state
LIKE '%$search%'
OR organization.orgname
LIKE '%$search%'
OR contacts.state
LIKE '%$search%'
OR contacts.lastname
LIKE '%$search%'
OR contacts.firstname
LIKE '%$search%'
ORDER BY '$sort' ASC";
}

$result = mysql_query($q)
or die('Query Failed: ' . mysql_error());
</snip>

Where is this evaluation breaking down and why? Thanks in advance.
You're problem is you are setting $q each time through the loop, then
using it outside of the loop. $q will always have the last value set in
the loop.

If $search matched the last state in your list, you would get the value
from your "then" clause. Any other time you'll get the value from your
"then" clause.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================
Sep 15 '06 #4

P: n/a
Jeff Gardner wrote:
Hans 'pritaeas' Pollaerts wrote:
>"Jeff Gardner" <us**@example.tldwrote in message
news:FN***************@newssvr11.news.prodigy.com ...
>>Greetings:

I am attempting to get conditional output based on POSTed form data.
If the posted value is either the key or value of an array, $x=key and
$q=foo. elseif it is neither key nor value(I tried || too) , $q=bar.
Even though $x is properly assigned the new value, $q always ends up
being bar. Abstractions aside, here's the code: (note ## comments
added to this post)

<snip>
$search = $_POST[search];
$sort = $_POST[sortby];
$states = array(
"AL" ="Alabama",
"AK" ="Alaska",
"AZ" ="Arizona",
...
);
##echo $search here outputs the POSTed input
foreach ($states as $key =$value)

if ($search == $value || $search == $key) {
$search = $key;
##echo $search here outputs the new value, when applicable
$q = "
SELECT
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR organization.org_id = 0
WHERE organization.state
= '$search'
OR contacts.state
= '$search'
ORDER BY '$sort' ASC";

} elseif ($search != $value && $search != $key) { ##I tried || here too.
##echo $search here outputs the new value too, when applicable
$q = "
SELECT
CONCAT(contacts.firstname,' ',contacts.lastname) AS fullname,
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR organization.org_id = 0
WHERE organization.state
LIKE '%$search%'
OR organization.orgname
LIKE '%$search%'
OR contacts.state
LIKE '%$search%'
OR contacts.lastname
LIKE '%$search%'
OR contacts.firstname
LIKE '%$search%'
ORDER BY '$sort' ASC";
}

$result = mysql_query($q)
or die('Query Failed: ' . mysql_error());
</snip>

Where is this evaluation breaking down and why? Thanks in advance.
--

Regards,

Jeff Gardner

Instead of the elseif you could just use else. Why check again, it's
either
a state value, or something else.

Hans

I added the elsif because I get the same output with an else. That's
why I suspect that there is a logic problem. For some reason, the second
$q variable is populated regardless of the previous conditional
statement being satisfied or not. If a state is not input, $search
remains untouched and the 2nd $q is populated as expected. If a state
is input, $search is modified but the 2nd $q is still populated.
The problem is how I am comparing $search with the array:

foreach ($states as $key =$value)

if ($search == $value || $search == $key)...

This ends up populating $search with multiple strings from the array.
The issue isn't with the logic but with my method of comparison to the
array. What's the proper way to compare strings with values within an
array? Would probably be a better question

--

Regards,

Jeff Gardner
___________________________

"Contrary to popular belief, Unix is user friendly. It just happens
to be very selective about who its friends are." --Kyle Hearn
Sep 15 '06 #5

P: n/a
Jerry Stuckle wrote:
Jeff Gardner wrote:
>Greetings:

I am attempting to get conditional output based on POSTed form
data. If the posted value is either the key or value of an array,
$x=key and $q=foo. elseif it is neither key nor value(I tried || too)
, $q=bar. Even though $x is properly assigned the new value, $q always
ends up being bar. Abstractions aside, here's the code: (note ##
comments added to this post)

<snip>
$search = $_POST[search];
$sort = $_POST[sortby];
$states = array(
"AL" ="Alabama",
"AK" ="Alaska",
"AZ" ="Arizona",
...
);
##echo $search here outputs the POSTed input
foreach ($states as $key =$value)

if ($search == $value || $search == $key) {
$search = $key;
##echo $search here outputs the new value, when applicable
$q = "
SELECT
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR organization.org_id = 0
WHERE organization.state
= '$search'
OR contacts.state
= '$search'
ORDER BY '$sort' ASC";
} elseif ($search != $value && $search != $key) { ##I tried ||
here too.
##echo $search here outputs the new value too, when applicable
$q = "
SELECT
CONCAT(contacts.firstname,' ',contacts.lastname) AS fullname,
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR organization.org_id = 0
WHERE organization.state
LIKE '%$search%'
OR organization.orgname
LIKE '%$search%'
OR contacts.state
LIKE '%$search%'
OR contacts.lastname
LIKE '%$search%'
OR contacts.firstname
LIKE '%$search%'
ORDER BY '$sort' ASC";
}

$result = mysql_query($q)
or die('Query Failed: ' . mysql_error());
</snip>

Where is this evaluation breaking down and why? Thanks in advance.

You're problem is you are setting $q each time through the loop, then
using it outside of the loop. $q will always have the last value set in
the loop.

If $search matched the last state in your list, you would get the value
from your "then" clause. Any other time you'll get the value from your
"then" clause.
Here's what ended up working: (note the if(){foreach(){if()}} at the
beginning) Unfortunately, in_array() and array_key_exists() are case
sensitive. I'm trying to figure out a way to get strtoupper and
ucfirst() to fix any input.

<snip>
$search = $_POST[search];
$sort = $_POST[sortby];
$states = array(
"AL" ="Alabama",
"AK" ="Alaska",
"AZ" ="Arizona",
...
);

if (in_array($search ,$states) || array_key_exists($search, $states)) {
foreach ($states as $key =$value){ if ($search == $value || $search
== $key){
$search = $key;
}}
$q = "
SELECT
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR contacts.org_id = 0
WHERE organization.state
LIKE '$search%'
OR contacts.state
LIKE '%$search%'
ORDER BY '$sort' ASC";

} else {
$q = "
SELECT
CONCAT(contacts.firstname,' ',contacts.lastname) AS fullname,
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR contacts.org_id = 0
WHERE organization.state
LIKE '%$search%'
OR organization.orgname
LIKE '%$search%'
OR contacts.state
LIKE '%$search%'
OR contacts.lastname
LIKE '%$search%'
OR contacts.firstname
LIKE '%$search%'
ORDER BY '$sort' ASC";
}
</snip>

--

Regards,

Jeff Gardner
___________________________

"Contrary to popular belief, Unix is user friendly. It just happens
to be very selective about who its friends are." --Kyle Hearn
Sep 15 '06 #6

P: n/a
Jeff Gardner wrote:
Jerry Stuckle wrote:
>Jeff Gardner wrote:
>>Greetings:

I am attempting to get conditional output based on POSTed form
data. If the posted value is either the key or value of an array,
$x=key and $q=foo. elseif it is neither key nor value(I tried ||
too) , $q=bar. Even though $x is properly assigned the new value, $q
always ends up being bar. Abstractions aside, here's the code:
(note ## comments added to this post)

<snip>
$search = $_POST[search];
$sort = $_POST[sortby];
$states = array(
"AL" ="Alabama",
"AK" ="Alaska",
"AZ" ="Arizona",
...
);
##echo $search here outputs the POSTed input
foreach ($states as $key =$value)

if ($search == $value || $search == $key) {
$search = $key;
##echo $search here outputs the new value, when applicable
$q = "
SELECT
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR organization.org_id = 0
WHERE organization.state
= '$search'
OR contacts.state
= '$search'
ORDER BY '$sort' ASC";
} elseif ($search != $value && $search != $key) { ##I tried ||
here too.
##echo $search here outputs the new value too, when applicable
$q = "
SELECT
CONCAT(contacts.firstname,' ',contacts.lastname) AS fullname,
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR organization.org_id = 0
WHERE organization.state
LIKE '%$search%'
OR organization.orgname
LIKE '%$search%'
OR contacts.state
LIKE '%$search%'
OR contacts.lastname
LIKE '%$search%'
OR contacts.firstname
LIKE '%$search%'
ORDER BY '$sort' ASC";
}

$result = mysql_query($q)
or die('Query Failed: ' . mysql_error());
</snip>

Where is this evaluation breaking down and why? Thanks in advance.


You're problem is you are setting $q each time through the loop, then
using it outside of the loop. $q will always have the last value set
in the loop.

If $search matched the last state in your list, you would get the
value from your "then" clause. Any other time you'll get the value
from your "then" clause.
Here's what ended up working: (note the if(){foreach(){if()}} at the
beginning) Unfortunately, in_array() and array_key_exists() are case
sensitive. I'm trying to figure out a way to get strtoupper and
ucfirst() to fix any input.

<snip>
$search = $_POST[search];
$sort = $_POST[sortby];
$states = array(
"AL" ="Alabama",
"AK" ="Alaska",
"AZ" ="Arizona",
...
);

if (in_array($search ,$states) || array_key_exists($search, $states)) {
foreach ($states as $key =$value){ if ($search == $value ||
$search == $key){
$search = $key;
}}
$q = "
SELECT
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR contacts.org_id = 0
WHERE organization.state
LIKE '$search%'
OR contacts.state
LIKE '%$search%'
ORDER BY '$sort' ASC";

} else {
$q = "
SELECT
CONCAT(contacts.firstname,' ',contacts.lastname) AS fullname,
organization.*, contacts.*
FROM organization
LEFT JOIN contacts
ON organization.org_id = contacts.org_id
OR contacts.org_id = 0
WHERE organization.state
LIKE '%$search%'
OR organization.orgname
LIKE '%$search%'
OR contacts.state
LIKE '%$search%'
OR contacts.lastname
LIKE '%$search%'
OR contacts.firstname
LIKE '%$search%'
ORDER BY '$sort' ASC";
}
</snip>
Hmmm, not easy to make a case insensitive search. The keys are already
upper case; maybe change the values to all lower case then if you find
it use ucwords() to uppercase the first char of each word?

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================
Sep 15 '06 #7

This discussion thread is closed

Replies have been disabled for this discussion.