If, else statements in PHP - php

Problem with writing an if-else statement for a sports website. The key is to display $game as W, L, or Tie depending on the scores which are parsed from a MySQL table from a variable called $row["result"]. The type of the column in table is VARCHAR and format the data saved in is $row["result"] = "A:B" where A is the home team's score and B is the opponents score. I am running into a problem where I write the if statement I can only echo Wins (W) and Ties (Tie) correctly!
For example the code:
<?php
$wl = $row["result"];
if ($wl[1] > $wl[3]) {
$game = "W";
}
if ($wl[1] < $wl[3]) {
$game = "L";
}
if ($wl[1] == $wl[3]) {
$game = "Tie";
}
?>
$game will output correctly when $wl= A>B and A==B but not A<B. I have a feeling this has something to do with PHP interpreting the data from $wl as not numbers, but some other format...

Try using "else if" instead of "if" on the last two "if" conditions. Also are you explode()'ing the result?
$wl = explode(':', $row['result']);
$wl[0] = Score for team A
$wl[1] = Score for team B

I'd also recommend using explode(), but for what you're using I think you should be referencing $wl[0] and $wl[2], since the array $wl starts at zero index.

Or here, if you want it in a cryptic way
$wl = explode(":",$row["result"]);
$game = ($wl[0]>$wl[1])?"W":(($wl[0]<$wl[1])?"L":"TIE");

Related

Using a switch statement with fetch_array

Ok, I've created a simple page that allows me to calculate customer satisfaction for the leaders who work in my store. Basically, I have a mysql database that contains the names of all the leaders who work there, along with the dates and time that they work. I also have a database that contains the dates, and times of a customers visit and the rating that they gave their visit.
I've created a query that behaves in such that when I query a leader's name, it returns all of the ratings/scores that were submitted by customers on the dates and times that specific leader was working.
Customers usually rate their experiences from 1 - 10 with 10 being the best. I wanted to transform those scored responses to a simple lettered system where a score of 9-10 would equal "G" for Good, 7-8 would equal "O" for ok and anything below 6 would equal "B" for bad.
Using mysqli_fetch_array and a switch statement, I tried to convert the numbers to the letters. However, I don't seem to be getting any results from this. I've tested the query and the fetch_array and if I use them by themselves (without the switch statement), they produce the correct scored responses (ie. Paul's score 10, 9, 9). But when I insert the switch statement, they do not convert to letters and nothing appears on the screen. Question: Is there something wrong with the way i'm using this switch statement or mysqli_fetch_array. I'm very new to coding so I may have a misunderstanding of the way these are used.
here's the php
<html>
<body>
<?php
include("db.php");
echo $_POST['searched']; // temp. check to see if post came through
echo '<br>';
$searched = $_POST["searched"]; // create variable to put searched name in query.
$good = array(); //create array to store good scores
$ok = array(); //create array to store ok scores
$bad = array(); //create array to store bad scores
// Search the database and retrieve all ratings That matches a managers name
$query = "SELECT leaders.name, responses.score
FROM leaders
INNER JOIN responses
ON leaders.shift_date = responses.visit_date
AND leaders.shift_time = responses.visit_time
AND leaders.name = '$searched' ORDER BY leaders.id;";
$result = $db->query($query); //store that query
//iterate through result and grab each score
while ($row = $result->fetch_array()){ // place scores into an array
// use a switch statement to change numbered system to lettered
switch($row[1]) {
case 10:
case 9:
array_push($good, "G");
break;
//echo $row[1] . ' '; temp check to ensure array call was successful
echo $good[0] . ' ';
}
}
//echo "<script>window.location = 'http://localhost/~baronjon/ilotf/main.php'</script>";
?>
</body>
</html>
You have to switch on a specific field of the array and not the whole array.
Try this
//iterate through result and grab each score
while ($row = $result->fetch_array()){ // place scores into an array
// use a switch statement to change numbered system to lettered
switch($row['score']) {
case 10:
case 9:
array_push($good, $row);
break;
case 8:
case 7:
array_push($ok, $row);
break;
default:
array_push($bad, $row);
} // endswitch
}
print_r( $good );
print_r( $ok );
print_r( $bad );
Now you have the 3 new arrays each containing the result rows that fall into the 3 categories.
PS Dont use row[0] syntax, because as soon as you change your select statement and add another field to the front of the field list you will be testing the wrong field in your switch.

Fetching rows from mysql several times embeded with php

i m dealing with 2 tables.I just want to know whether there is something code that helps me fetching rows for multiple times without writing same query for that many times:
Example:
while($row1=mysqli_fetch_array($result1)) {
while($row2=mysqli_fetch_array($result2)){
//checking for some condition
}
}
In above code unlike array we cant reset a variable outside the inner loop as follows
while($row1=mysqli_fetch_array($result1)) {
$number=0;//so that v can start from first row
while($row2=mysqli_fetch_array($result2)){
//checking for some condition
}
}
I m totally aware that rows and array are different,So i m asking if there is FOR loop we can use on rows?? like:
while($row1=mysqli_fetch_array($result1)) {
for(...){
//so dat it will xecute no.of whileloops*no.of for loops.
}
}
if not clear ask for more.
Your suggestions are much obliged.
Edit:
table: Year
1999
2000
2002
2004
2000
$result=mysqli_query($con,"select distinct Year from table_name");
dataset=mysqli_fetch_array($result)..
If I got it right, you want to match all the results of the first query against all the results of the second query.
In that case, you should first gather all the results of both queries in two PHP arrays (of arrays) and then work with these variables, like so:
$list1=array();
while ($row=mysqli_fetch_array($result1)) $list1[] = $row;
$list2=array();
while ($row=mysqli_fetch_array($result2)) $list2[] = $row;
foreach ($list1 as $row1)
foreach ($list2 as $row2)
{
match_against ($row1, $row2);
}
Note that it looks very much like an SQL JOIN done in PHP.
Why not, as long as the number of results stay within reasonable bounds.
But if it's not the case (i.e. $list1 or $list2 could contain hundreds of elements), be aware that your code will very likely be a lot less efficient than what a DB engine can do.
That's why you might want to consider replacing this code with an SQL query.
Try this (if i understood ):
while( list($row1,$row2) = array(mysqli_fetch_array($result1),mysqli_fetch_array($result2)) ){
// check condition
}
$dataSet1 = mysqli_fetch_all($result1);
$dataSet2 = mysqli_fetch_all($result2);
foreach($dataSet1 AS $row1){
foreach($dataSet2 AS $row2){
}
}
Something like this might work?

SQL Result Random loop through

I have a SQL database that contains a field. I can get all of the elements in that field by:
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)){
$ftype =$row['ftype']; //name of field is 'ftype'
print $ftype} //do something
I want a random element to be printed out each time the page is opened/refreshed.
Knowing that the result is an array containing the information i want, I want to randomly choose an element of the array. Also, if there are N elements in the array, I want to choose all N elements exactly once before I show any element again for second time. The process repeats itself. I know how to code something like this in java or python, but I don't think that's the way I should go.
I think I need to use javascript, but I'm just not sure what technology to use.
UPDATE:
Patrick's idea seems to be exactly what i was looking for. I thought I would share what I have now and maybe you can suggest optimization. I hope the intent in the code is obvious.
<?
session_start();
if (!isset($_SESSION['count']) || !isset($_SESSION['randomArray'])) {
$count = 0;
$randomArray = array();
$sql="SELECT youtubeurl FROM Foodlist";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)){
array_push($randomArray,$row['youtubeurl']);
}
shuffle($randomArray);
$_SESSION['randomArray'] = $randomArray;
$_SESSION['count'] = $count;
} elseif ($_SESSION['count'] >= sizeof($_SESSION['randomArray'])){
$_SESSION['count'] = 0;
$randomArray = $_SESSION['randomArray'];
shuffle($randomArray);
$_SESSION['randomArray'] = $randomArray;
} else{
$randomArray = $_SESSION['randomArray'];
$count = $_SESSION['count'];
echo $randomArray[$count];
$_SESSION['count']++;
}
?>
You can do this without Javascript, however you'll need to open/maintain a session.
Pseudocode:
data = data_from_mysql()
choice = random.choice(data, exclude = SESSION['choices'])
SESSION['choices'].append(choice)
print choice
if len(SESSION['choices']) == len(data):
SESSION['choices'] = []
If you want a random result let the dbms take care of it. Add this to the bottom of your sql query.
ORDER BY RAND()
LIMIT 1

How to make a "distinct" detection on a foreach loop

At this time I have this very complex query that I loop through and I get something like this:
List of Challenges:
TEAM A
- Challenge 1
TEAM A
- Challenge 4
TEAM A
- Challege 6
And I want to change to something like:
TEAM A
- Challenge 1
- Challenge 4
- Challenge 6
My question is, since the query is a very complex one, maybe I could do this inside the loop but, if that's the case, how can we achieve something like that?
Can I ask an example case so that I can use, in order to solve this issue?
Thanks a lot,
MEM
UPDATE:
The query is something like this:
Translated:
public function listachallengesPendentes()
{
$select = $this->getAdapter()->select();
$select->from(array("e"=>"teams"),array('name'));
$select->join(array("de"=>"challengeperteam"),"e.cod_team = de.cod_teamFk",array());
$select->join(array("d"=>"challenges"),"d.cod_challenge = de.cod_challengeFk",array('title'));
$select->columns(array("e.cod_team"
,"name_team"=>"e.name"
,"d.cod_challenge"
,"name_challenge"=>"d.title"
,"d.details"
,"d.score"
,"category"=>"d.cod_categoryFk"
,"de.proof"
,"de.date_concluded"
,"de.cod_challenge_team"
));
$select->where("de.status = 0");
$select->order(array('e.cod_team DESC', 'de.cod_challenge_team DESC'));
return $this->getAdapter()->fetchAll($select);
}
So I need to add a distinct some part :s :D ?
The foreach actually is pretty basic:
foreach ($challenges as $d){
//display the name:
echo $d['name_team'];
...
}
UPDATE 2
The clean query (not tested):
SELECT e.name
,d.cod_team
,d.cod_challenge
,d.title
,d.details
,d.score
,de.proof
,de.date_concluded
,de.cod_challenge_team
FROM teams e
INNER JOIN challengeperteam de ON de.cod_teamFk = e.cod_team
INNER JOIN challenges d ON d.cod_challenge = de.cod_challengeFk
WHERE de.status = 0
ORDER BY e.cod_team DESC, de.cod_challenge_team DESC;
Something along the lines of:
$current_team = null;
foreach($challenges as $challenge){
if($current_team != $challenge->team){
$current_team = $challenge->team;
echo $current_team, "\n";
}
echo $challenge->challenge_name, "\n";
}
At a very basic level, ie in the loop, you can just detect if the TEAM A variable is equal to the current (previous) value, and if so, don't print it a second time. This relies on the result set being sorted on the TEAM A column.
However, you can also do this in the SQL query, so if you can provide the current SQL Query, I can explain how you'd update it.
you could store the array results in a multi-dimensional array like so:
$query_Challenges = "SELECT `Team`,`Challenges` FROM YourTable";
$Challenges = mysql_query($query_Challenges, $dbconnection) or die(mysql_error());
$row_Challenges = mysql_fetch_assoc($Challenges);
$challengeResults = array();
do{
if(!array_key_exists($row_Challenges['cod_team'])){
$challengeResults[$row_Challenges['cod_team']] = array();
}
$challengeResults[$row_Challenges['cod_team']][] = $row_Challenges['cod_challenge_team'];
}while($row_Challenges = mysql_fetch_assoc($Challenges));
EDIT
looking at your query statement, the data should be already sorted properly by your ORDER clause, so if you just need not repeatedly print the team as shown in codeblock 2, then something like:
$team = '';
do {
if($team != $row_Challenges['cod_team']){
echo "TEAM $row_Challenges['cod_team']<br/>";
$team = $row_Challenges['cod_team'];
}
echo " - $row_Challenges['cod_challenge_team']<br />";
}while($row_Challenges = mysql_fetch_assoc($Challenges));
you could easily substitute a foreach for the do loop, as long as there is a variable used as the "current team" and an if statement used to say "dont print the next team name unless its different than the current team name"

When listing information from a database using php and mysql how would you make the first row look different to the rest?

Basically I have articles in my database and I want to alter the way the first record displays. I want the lastest (Posted) article to be the focus and the older article just to list, (see F1.com). I need to know how to get the first of my values in the array and get it to display differently but I am not sure how to do this, I can do it so all rows display the same just not how to alter the first row. I also need to know how to tell the rest of the rows to display the same afterwards im guessing you use an if statement there and before that some kind of count for the rows.
Current code:
$result = mysql_query("SELECT * FROM dbArticle WHERE userID='".$_SESSION["**"]."' ORDER BY timestamp DESC");
while($row = mysql_fetch_array($result))
{
echo "<h2 class=\"heading1\">". $row['title'] ."</h2>";
echo "By: ".$row['username']." Type: ".$row['type']." Posted: ".$row['timestamp']."
$body = $row['body'];
echo "<br/><p>";
echo substr("$body",0,260);
echo "...<span class=\"tool\"><a class=\"blue\" href=\"index.php?pageContent=readArticle&id=".$row['id']."\">Read More</a></span></p><hr/>";
}
mysql_close($con);
Ok I have taken Luke Dennis's code and tried to test it, but I am getting this error: Warning: Invalid argument supplied for foreach() this is the line of the foreach statment. Something that has just come to mind is that I will only want 5 or so of the older articles to display. This is what I have thats creating the error:
<? $con = mysql_connect("localhost","****","***");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("******", $con);
$result = mysql_query("SELECT * FROM dbArticle ORDER BY timestamp DESC");
$first = true;
foreach($result as $row){
if($first)
{
echo"".$row['title']."";
echo"this is the headline";
$first = false;
}
else
{
echo"".$row['title']."";
}
}
?>
Do I need to add mysql_fetch_array somewhere to set the array up?
I would just iterate through the results and apply a css class to the first entry:
$first = true;
while ($row = mysql_fetch_assoc($result)) {
$cssClass = '';
if ($first) {
$cssClass = 'highlight';
}
echo '<p class="' . $cssClass . '">' . $row['text'] . '</p>';
$first = false;
}
It's a bit crude, but I often hard-code a variable to designate the first run through a loop. So something like:
$first = true;
foreach($list_of_items as $item)
{
if($first)
{
// Do some stuff
$first = false;
}
else
{
// Do some other stuff
}
}
A simple if statement when looping through your results will usually do the trick. You can use a boolean to indicate if you've output the first row of results or now. If you haven't then give it a particular style and then set the boolean to true. Then all subsequent rows get a different style.
All of the above are correct. Luke Dennis' post is of course fleshed-out a bit more.
As Brian Fisher said, add some CSS styling to the first link when you encounter it per Luke's post.
I took a look at the article list on the F1 website. Pretty well constructed site - "One would expect that." :-)
Anyway, the article listings are contained within a two row table (summary="Latest Headlines") in descending order (newest first).
Just place a class in the second column (<td class="first-news-article">). Then add the class name and appropriate styling values in the css file - probably your' modules.css. There's already quite a few class values associated with articles in that file, so you may be able to just use an existing value.
That should be about it - other than actually doing it!
By the way, judging by the quality of the underlying html, I'm assuming there's already an "article list emitter." Just find that emitter and place the appropriate conditional to test for the first record.
Darrell
I just noted your code addition. I assume that you were showing the F1 site as an example. Anyway, I think you're on your way.
I presume you have some code that loops through your resultset and prints them into the page? Could you paste this code in, and that might give us a starting point to help you.
I don't know PHP, so I'll pseudocode it in Perl. I wouldn't do it like this:
my $row_num = 0;
for my $row ($query->next) {
$row_num++;
if( $row_num == 1 ) {
...format the first row...
}
else {
...format everything else...
}
}
The if statement inside the loop unnecessarily clutters the loop logic. It's not a performance issue, it's a code readability and maintainability issue. That sort of thing just BEGS for a bug. Take advantage of the fact that it's the first thing in the array. It's two different things, do them in two different pieces of code.
my $first = $query->next;
...format $first...
for my $row ($query->next) {
...format the row...
}
Of course, you must make the first row stand out by using tags.
I'd use array_shift():
$result = mysql_fetch_assoc($resultFromSql); // <- edit
$first = array_shift($result);
echo '<h1>'.$first['title'].'</h1>';
foreach ($result as $row) {
echo '<h2>'.$row['title'].'</h2>';
}
The best way to do this is to put a fetch statement prior to the while loop.
Putting a test inside the while loop that is only true for one iteration can be a waste of time for a result of millions of rows.

Categories