noob321 Posted April 6, 2014 Share Posted April 6, 2014 Hello , i have had made a number of changes to the below program but am really stumped on my last task- i need a multiple attribute to pull multiple 'teams' data (points,goal difference etc) with php form. i can get single teams to work but not multiple. see screen attached and heres my code below. <html> <head> <style> .red {color: red} </style> <title>Table</title> </head> <body> <?php if ($_SERVER["REQUEST_METHOD"] == "POST" ){ $tablesPage = "http://www.bbc.com/sport/football/tables"; if(!empty($_POST["team"])){ $teamData= getTeamData($_POST["team"] , $tablesPage); //get associative array of team data if(!empty($_POST["data"]) && $_POST["data"] == "results"){ echo getResults($teamData); } else if(!empty($_POST["data"]) && $_POST["data"] == "position"){ echo getPosition($teamData); } else if(!empty($_POST["data"]) && $_POST["data"] == "two points for a win"){ echo getPoints($teamData); } else if(!empty($_POST["data"]) && $_POST["data"] == "goal difference"){ echo getDifference($teamData); } } } function getPosition($teamData){ /*This function takes an array of team data and returns a string containing the name of the team and its position in the leauge */ return "Team ". $teamData["team"] ." are currently number " . $teamData["position"] . " in the league " ; } function getResults($teamData){ /*This function takes an array of team data and returns a string containing the results of the team */ return $teamData["team"] ." have won " . $teamData["won"] . " , drawn " . $teamData["drew"] . " , and lost " . $teamData["lost"] . " games to date " ; } function getPoints($teamData){ /*This function takes an array of team data and returns a string containing the points and calculates the old two points system */ $oldpoints = $teamData["won"] * 2 + $teamData["drew"]; return $teamData["team"] ." have " . $teamData["points"] . " points under the current system " . "<br> Under two points for a win they would have " . $oldpoints ; } function getDifference($teamData){ /*This function takes an array of team data and returns a string containing the name of the team and its goal difference in the leauge */ return $teamData["team"] ." goal difference is " . $teamData["difference"] . " at the moment " ; } function getTeamData($team, $tablesPage){ /* This function takes a webpage url and the name of a team as two string arguments. e.g. getTeam(""http://www.bbc.com/sport/football/tables", "liverpool") It returns an array of data about the team. You don't need to understand what this function does just that it returns an array which contains keya and values. The values map to the following keys: "position", "team", "played", "won", "drew", "lost", "for", "against", "difference", "points" */ $html = new DOMDocument(); @$html->loadHtmlFile($tablesPage); //use DOM @$xpath = new DOMXPath($html); //use XPath $items = $xpath->query('//td/a[text()="' . $team . '"]/../..'); //get the relevant table row $values[] = array(); foreach($items as $node){ foreach($node->childNodes as $child) { if($child->nodeType == 1) array_push($values, $child->nodeValue); //KLUDGE } } $values[2] = substr($values[2], -1); //KLUDGE $values = array_slice( $values, 2, count($values)-4); //KLUDGE $keys = array("position", "team", "played", "won", "drew", "lost", "for", "against", "difference", "points"); return array_combine($keys, $values); } ?> <br> Select a team and a data item about that team <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"> <select name="team" multiple="multiple" size="3" <option value=""></option> <option value="Everton">Everton</option> <option value="Arsenal">Arsenal</option> <option value="Chelsea">Chelsea</option> <option value="Man Utd">Man Utd</option> <option value="Liverpool">Liverpool</option> </select> <select name="data"> <option value="position">position</option> <option value="results">results</option> <option value="two points for a win">two points for a win</option> <option value="goal difference">goal difference</option> <select> <input type="submit" value="Get Data"></input> </select> </form> </body> </html> Quote Link to comment https://forums.phpfreaks.com/topic/287559-multiple-attribute-problem/ Share on other sites More sharing options...
Ch0cu3r Posted April 6, 2014 Share Posted April 6, 2014 (edited) You have left of the closing angle bracket ( > ) for your select tag here <select name="team" multiple="multiple" size="3" Also when using the multiple attribute on your select tag you need append square brakes [] to the field name. The chosen teams will be submitted as an array. Which will mean you will need to loop through the $_POST['team'] array to get each chosen team. Before looping over this array you may want to change the getTeamData() function so it one gets the results from the bbc once, not foreach time you want to get the result for a team. Edited April 6, 2014 by Ch0cu3r Quote Link to comment https://forums.phpfreaks.com/topic/287559-multiple-attribute-problem/#findComment-1475110 Share on other sites More sharing options...
noob321 Posted April 6, 2014 Author Share Posted April 6, 2014 ok thanks I've corrected to multiple attribute tag, unfortunately I'm unsure as to where id fix the getTemData() to output multiple teams data Quote Link to comment https://forums.phpfreaks.com/topic/287559-multiple-attribute-problem/#findComment-1475113 Share on other sites More sharing options...
Ch0cu3r Posted April 6, 2014 Share Posted April 6, 2014 First you need to remove these lines fromthe getTeamData function. $xml = new DOMDocument(); @$xml->loadHtmlFile($tablesPage); //use DOM And place them into a new function, call it getLeageResults, you'd pass this function $tableData as an argument. // this functions get the rsesults from the bbc, and returns the xml object function getLeageResults($tableData) { $xml = new DOMDocument(); @$xml->loadHtmlFile($tablesPage); // get the DOM of the HTML return $xml; // return the xml object } Now you'd only call this function first to get the league table results. $results = getLeagueResults($tableData); Now you'd pass getTeamData() $results instead of $tableData. The first two lines of code for the getTeamData function should be function getTeamData($team, $xmlResults){ @$xpath = new DOMXPath($xmlResults); //use XPath Now you can loop through the $_POST['team'] array and call getTeamData to get the chosen teams results. $results = getLeageResults($tableData); // loop through the teams, extracting their data from the results table foreach($_POST['teams'] as $team) { $teamData = getTeamData($team, $results); //.. now decide what to do with $teamData, eg show each selected teams results echo getResults($teamData) . '</br />'; } Quote Link to comment https://forums.phpfreaks.com/topic/287559-multiple-attribute-problem/#findComment-1475118 Share on other sites More sharing options...
noob321 Posted April 6, 2014 Author Share Posted April 6, 2014 thanks so much, am getting a few errors though! Notice: Undefined variable: tableData in /Applications/MAMP/htdocs/table3.php on line 18Notice: Undefined offset: 2 in /Applications/MAMP/htdocs/table3.php on line 83Warning: array_combine(): Both parameters should have an equal number of elements in /Applications/MAMP/htdocs/table3.php on line 86have won , drawn , and lost games to date and heres my code with your changes...maybe i have entered it wrong ... <html> <head> <style> .red {color: red} </style> <title>Table</title> </head> <body> <?php if ($_SERVER["REQUEST_METHOD"] == "POST" ){ $tablesPage = "http://www.bbc.com/sport/football/tables"; $results = getLeagueResults($tableData); // loop through the teams, extracting their data from the results table foreach($_POST['team'] as $team) { $teamData = getTeamData($team, $results); //.. now decide what to do with $teamData, eg show each selected teams results echo getResults($teamData) . '</br />'; } } function getPosition($teamData){ /*This function takes an array of team data and returns a string containing the name of the team and its position in the leauge */ return "Team ". $teamData["team"] ." are currently number " . $teamData["position"] . " in the league " ; } function getResults($teamData){ /*This function takes an array of team data and returns a string containing the results of the team */ return $teamData["team"] ." have won " . $teamData["won"] . " , drawn " . $teamData["drew"] . " , and lost " . $teamData["lost"] . " games to date " ; } function getPoints($teamData){ /*This function takes an array of team data and returns a string containing the points and calculates the old two points system */ $oldpoints = $teamData["won"] * 2 + $teamData["drew"]; return $teamData["team"] ." have " . $teamData["points"] . " points under the current system " . "<br> Under two points for a win they would have " . $oldpoints ; } function getDifference($teamData){ /*This function takes an array of team data and returns a string containing the name of the team and its goal difference in the leauge */ return $teamData["team"] ." goal difference is " . $teamData["difference"] . " at the moment " ; } // this functions get the rsesults from the bbc, and returns the xml object function getLeagueResults($tableData) { $xml = new DOMDocument(); @$xml->loadHtmlFile($tablesPage); // get the DOM of the HTML return $xml; // return the xml object } function getTeamData($team, $xmlResults){ /* This function takes a webpage url and the name of a team as two string arguments. e.g. getTeam(""http://www.bbc.com/sport/football/tables", "liverpool") It returns an array of data about the team. You don't need to understand what this function does just that it returns an array which contains keya and values. The values map to the following keys: "position", "team", "played", "won", "drew", "lost", "for", "against", "difference", "points" */ @$xpath = new DOMXPath($xmlResults); //use XPath $items = $xpath->query('//td/a[text()="' . $team . '"]/../..'); //get the relevant table row $values[] = array(); foreach($items as $node){ foreach($node->childNodes as $child) { if($child->nodeType == 1) array_push($values, $child->nodeValue); //KLUDGE } } $values[2] = substr($values[2], -1); //KLUDGE $values = array_slice( $values, 2, count($values)-4); //KLUDGE $keys = array("position", "team", "played", "won", "drew", "lost", "for", "against", "difference", "points"); return array_combine($keys, $values); } ?> <br> Select a team and a data item about that team <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"> <select name="team[]" multiple="multiple" size="3"> <option value=""></option> <option value="Everton">Everton</option> <option value="Arsenal">Arsenal</option> <option value="Chelsea">Chelsea</option> <option value="Man Utd">Man Utd</option> <option value="Liverpool">Liverpool</option> </select> <select name="data"> <option value="position">position</option> <option value="results">results</option> <option value="two points for a win">two points for a win</option> <option value="goal difference">goal difference</option> <select> <input type="submit" value="Get Data"></input> </select> </form> </body> </html> Quote Link to comment https://forums.phpfreaks.com/topic/287559-multiple-attribute-problem/#findComment-1475133 Share on other sites More sharing options...
Ch0cu3r Posted April 6, 2014 Share Posted April 6, 2014 (edited) $tableData should be of been $tablesPage on line 18 and 58 (I gave the wrong variable name) Edited April 6, 2014 by Ch0cu3r Quote Link to comment https://forums.phpfreaks.com/topic/287559-multiple-attribute-problem/#findComment-1475135 Share on other sites More sharing options...
noob321 Posted April 6, 2014 Author Share Posted April 6, 2014 thanks again, i made that change, but am now getting :Notice: Undefined offset: 2 in /Applications/MAMP/htdocs/table3.php on line 83Warning: array_combine(): Both parameters should have an equal number of elements in /Applications/MAMP/htdocs/table3.php on line 86have won , drawn , and lost games to date Notice: Undefined offset: 2 in /Applications/MAMP/htdocs/table3.php on line 83Warning: array_combine(): Both parameters should have an equal number of elements in /Applications/MAMP/htdocs/table3.php on line 86have won , drawn , and lost games to date Quote Link to comment https://forums.phpfreaks.com/topic/287559-multiple-attribute-problem/#findComment-1475137 Share on other sites More sharing options...
Ch0cu3r Posted April 6, 2014 Share Posted April 6, 2014 I have copied the code in post #5 and changed the variables on line 18 and 58 to $tablesPage and I do not get those errors. The only time I do get those errors is when choosing the empty option (before Everton) from the list. Make sure you have chosen a team from the list before submitting the form when testing the code Quote Link to comment https://forums.phpfreaks.com/topic/287559-multiple-attribute-problem/#findComment-1475138 Share on other sites More sharing options...
noob321 Posted April 6, 2014 Author Share Posted April 6, 2014 okay , thanks so much again. i tried it again ensuring i select a team or teams but no joy I'm afraid. maybe i need to add more echo's to // loop through the teams, extracting their data from the results table foreach($_POST['team'] as $team) { $teamData = getTeamData($team, $results); //.. now decide what to do with $teamData, eg show each selected teams results echo getResults($teamData) . '</br />'; } Quote Link to comment https://forums.phpfreaks.com/topic/287559-multiple-attribute-problem/#findComment-1475139 Share on other sites More sharing options...
noob321 Posted April 6, 2014 Author Share Posted April 6, 2014 So i added the additional echo's , now I'm getting :Notice: Undefined offset: 2 in /Applications/MAMP/htdocs/table3.php on line 83Warning: array_combine(): Both parameters should have an equal number of elements in /Applications/MAMP/htdocs/table3.php on line 86Team are currently number in the league have won , drawn , and lost games to date have points under the current system Under two points for a win they would have 0goal difference is at the moment Notice: Undefined offset: 2 in /Applications/MAMP/htdocs/table3.php on line 83Warning: array_combine(): Both parameters should have an equal number of elements in /Applications/MAMP/htdocs/table3.php on line 86Team are currently number in the league have won , drawn , and lost games to date have points under the current system Under two points for a win they would have 0goal difference is at the moment Quote Link to comment https://forums.phpfreaks.com/topic/287559-multiple-attribute-problem/#findComment-1475140 Share on other sites More sharing options...
Ch0cu3r Posted April 6, 2014 Share Posted April 6, 2014 Can you post your code? This is what I am testing with and I get no errors. <html> <head> <style> .red {color: red} </style> <title>Table</title> </head> <body> <br> Select a team and a data item about that team <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"> <select name="team[]" multiple="multiple" size="3"> <option value=""></option> <option value="Everton">Everton</option> <option value="Arsenal">Arsenal</option> <option value="Chelsea">Chelsea</option> <option value="Man Utd">Man Utd</option> <option value="Liverpool">Liverpool</option> </select> <select name="data"> <option value="position">position</option> <option value="results">results</option> <option value="two points for a win">two points for a win</option> <option value="goal difference">goal difference</option> <select> <input type="submit" value="Get Data"></input> </select> </form> </body> </html> <?php if ($_SERVER["REQUEST_METHOD"] == "POST" ) { $tablesPage = "http://www.bbc.com/sport/football/tables"; $results = getLeagueResults($tablesPage); // loop through the teams, extracting their data from the results table foreach($_POST['team'] as $team) { $teamData = getTeamData($team, $results); //.. now decide what to do with $teamData, eg show each selected teams results echo getResults($teamData) . '</br />'; } } function getPosition($teamData){ /*This function takes an array of team data and returns a string containing the name of the team and its position in the leauge */ return "Team ". $teamData["team"] ." are currently number " . $teamData["position"] . " in the league " ; } function getResults($teamData){ /*This function takes an array of team data and returns a string containing the results of the team */ return $teamData["team"] ." have won " . $teamData["won"] . " , drawn " . $teamData["drew"] . " , and lost " . $teamData["lost"] . " games to date " ; } function getPoints($teamData){ /*This function takes an array of team data and returns a string containing the points and calculates the old two points system */ $oldpoints = $teamData["won"] * 2 + $teamData["drew"]; return $teamData["team"] ." have " . $teamData["points"] . " points under the current system " . "<br> Under two points for a win they would have " . $oldpoints ; } function getDifference($teamData){ /*This function takes an array of team data and returns a string containing the name of the team and its goal difference in the leauge */ return $teamData["team"] ." goal difference is " . $teamData["difference"] . " at the moment " ; } // this functions get the rsesults from the bbc, and returns the xml object function getLeagueResults($tablesPage) { $xml = new DOMDocument(); @$xml->loadHtmlFile($tablesPage); // get the DOM of the HTML return $xml; // return the xml object } function getTeamData($team, $xmlResults){ /* This function takes a webpage url and the name of a team as two string arguments. e.g. getTeam(""http://www.bbc.com/sport/football/tables", "liverpool") It returns an array of data about the team. You don't need to understand what this function does just that it returns an array which contains keya and values. The values map to the following keys: "position", "team", "played", "won", "drew", "lost", "for", "against", "difference", "points" */ @$xpath = new DOMXPath($xmlResults); //use XPath $items = $xpath->query('//td/a[text()="' . $team . '"]/../..'); //get the relevant table row $values[] = array(); foreach($items as $node){ foreach($node->childNodes as $child) { if($child->nodeType == 1) array_push($values, $child->nodeValue); //KLUDGE } } $values[2] = substr($values[2], -1); //KLUDGE $values = array_slice( $values, 2, count($values)-4); //KLUDGE $keys = array("position", "team", "played", "won", "drew", "lost", "for", "against", "difference", "points"); return array_combine($keys, $values); } ?> Quote Link to comment https://forums.phpfreaks.com/topic/287559-multiple-attribute-problem/#findComment-1475141 Share on other sites More sharing options...
noob321 Posted April 6, 2014 Author Share Posted April 6, 2014 sure , here it is: <html> <head> <style> .red {color: red} </style> <title>Table</title> </head> <body> <?php if ($_SERVER["REQUEST_METHOD"] == "POST" ){ $tablesPage = "http://www.bbc.com/sport/football/tables"; $results = getLeagueResults($tablesPage); // loop through the teams, extracting their data from the results table foreach($_POST['team'] as $team) { $teamData = getTeamData($team, $results); //.. now decide what to do with $teamData, eg show each selected teams results echo getPosition($teamData) . '</br />'; echo getResults($teamData) . '</br />'; echo getPoints($teamData) . '</br />'; echo getDifference($teamData) . '</br />'; } } function getPosition($teamData){ /*This function takes an array of team data and returns a string containing the name of the team and its position in the leauge */ return "Team ". $teamData["team"] ." are currently number " . $teamData["position"] . " in the league " ; } function getResults($teamData){ /*This function takes an array of team data and returns a string containing the results of the team */ return $teamData["team"] ." have won " . $teamData["won"] . " , drawn " . $teamData["drew"] . " , and lost " . $teamData["lost"] . " games to date " ; } function getPoints($teamData){ /*This function takes an array of team data and returns a string containing the points and calculates the old two points system */ $oldpoints = $teamData["won"] * 2 + $teamData["drew"]; return $teamData["team"] ." have " . $teamData["points"] . " points under the current system " . "<br> Under two points for a win they would have " . $oldpoints ; } function getDifference($teamData){ /*This function takes an array of team data and returns a string containing the name of the team and its goal difference in the leauge */ return $teamData["team"] ." goal difference is " . $teamData["difference"] . " at the moment " ; } // this functions get the rsesults from the bbc, and returns the xml object function getLeagueResults($tableData) { $xml = new DOMDocument(); @$xml->loadHtmlFile($tablesPage); // get the DOM of the HTML return $xml; // return the xml object } function getTeamData($team, $xmlResults){ /* This function takes a webpage url and the name of a team as two string arguments. e.g. getTeam(""http://www.bbc.com/sport/football/tables", "liverpool") It returns an array of data about the team. You don't need to understand what this function does just that it returns an array which contains keya and values. The values map to the following keys: "position", "team", "played", "won", "drew", "lost", "for", "against", "difference", "points" */ @$xpath = new DOMXPath($xmlResults); //use XPath $items = $xpath->query('//td/a[text()="' . $team . '"]/../..'); //get the relevant table row $values[] = array(); foreach($items as $node){ foreach($node->childNodes as $child) { if($child->nodeType == 1) array_push($values, $child->nodeValue); //KLUDGE } } $values[2] = substr($values[2], -1); //KLUDGE $values = array_slice( $values, 2, count($values)-4); //KLUDGE $keys = array("position", "team", "played", "won", "drew", "lost", "for", "against", "difference", "points"); return array_combine($keys, $values); } ?> <br> Select a team and a data item about that team <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"> <select name="team[]" multiple="multiple" size="3"> <option value=""></option> <option value="Everton">Everton</option> <option value="Arsenal">Arsenal</option> <option value="Chelsea">Chelsea</option> <option value="Man Utd">Man Utd</option> <option value="Liverpool">Liverpool</option> </select> <select name="data"> <option value="position">position</option> <option value="results">results</option> <option value="two points for a win">two points for a win</option> <option value="goal difference">goal difference</option> <select> <input type="submit" value="Get Data"></input> </select> </form> </body> </html> Quote Link to comment https://forums.phpfreaks.com/topic/287559-multiple-attribute-problem/#findComment-1475147 Share on other sites More sharing options...
Solution noob321 Posted April 6, 2014 Author Solution Share Posted April 6, 2014 my bad , pasted your code - all good! thanks again :-) Quote Link to comment https://forums.phpfreaks.com/topic/287559-multiple-attribute-problem/#findComment-1475149 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.