wrave Posted March 5, 2008 Share Posted March 5, 2008 Immense apologies right up front because I know this topic has no doubt been cussed and discussed but I have attempted to do a search and I keep erroring out. The error page said to contact a moderator but I couldn't find a place to do that. Anyway... I am building some functions that I hope will reduce some of my typing. I have to files with functions in them and they are in my PATH. No problems there. One file contains functions to access my databases (my_db_func.php) and one that contains functions to help me display results (my_disp_func.php). I am attempting to build a generic function to display query results. I have a function that extracts the field names returned from a query. I then take those results and pass them to a function that starts building an HTML table and populates the table header cells with the field names. It doesn't close the HTML table but leaves it open so I can construct the remainder of the table with the results of a query to my database. Using these three functions I can execute a query and get a nice looking table display. So I got to thinking it would take things one step further and eliminate a couple of calls by executing the query once and passing the results to a function I call 'disp_query_results_HTML($data)'. So I attempted to place the calls to the 'extract_fld_names()' and 'disp_fld_names_HTML()' within my query results display function. Everything works beautifully if I make the calls individually but when I place a function call within a function it comes to a halt and refuses to continue with any code after the first function is called. After testing it appears that all of the data from my database query is still there. I read in the manual that PHP allows one function to call another. The display function file has a "require_once" command loading the file that contains the data manipulation functions so I know it is found. The field names are extracted. I don't get any error messages, the top field names part of the display functions correctly, but after the table header is displayed, the remainder of the calling function fails. I just can't seem to figure out why this isn't working. Here's the functions... From my_disp_func.php... [pre] function disp_query_results_HTML($data) { $fld_names = extract_fld_names($data); disp_fld_names_HTML($fld_names); $row_count = mysql_num_rows($data); $field_count = mysql_num_fields($data); while ($row = mysql_fetch_array($data, MYSQL_NUM)) { echo "<tr>"; for ($i = 0; $i < $field_count; ++$i) { if ($row[$i] == "") { echo "<td> </td>\n"; } else { echo "<td>$row[$i]</td>\n"; } } echo "</tr>\n"; } echo "</tr></table><br />"; } function disp_fld_names_HTML($header_list, $bgcolor = "#ffffdd") { $flds = count($header_list); echo "<table border=1 bgcolor=\"$bgcolor\" cellpadding=3><tr>"; for ($idx = 0; $idx <= $flds-1; ++$idx) { echo "<th>$header_list[$idx]</th>\n"; } echo "</tr>\n"; }[/pre] And from my_db_func.php... [pre] function extract_fld_names($data) { $count = count("$data"); $loop_count = 0; $list[0]= ''; while ($row = mysql_fetch_array($data, MYSQL_NUM)) { foreach ($row as $key => $value) { if ($key == 0) { $list[$loop_count] = "$value"; } } ++$loop_count; } return $list; }[/pre] I am sure this question has been asked before and again I apologise for my problems in searching the forums. Quote Link to comment https://forums.phpfreaks.com/topic/94532-functions-calling-functions/ Share on other sites More sharing options...
MmmVomit Posted March 5, 2008 Share Posted March 5, 2008 You might try changing the order of the functions in the code. This might make a difference. You essentially have: function disp_query_results_HTML($data) { //... disp_fld_names_HTML($fld_names); //... } function disp_fld_names_HTML($header_list, $bgcolor = "#ffffdd") { /... } You should try this instead: function disp_fld_names_HTML($header_list, $bgcolor = "#ffffdd") { /... } function disp_query_results_HTML($data) { //... disp_fld_names_HTML($fld_names); //... } Quote Link to comment https://forums.phpfreaks.com/topic/94532-functions-calling-functions/#findComment-484064 Share on other sites More sharing options...
phpSensei Posted March 5, 2008 Share Posted March 5, 2008 It doesnt matter where your functions are.... or how they are ordered. Quote Link to comment https://forums.phpfreaks.com/topic/94532-functions-calling-functions/#findComment-484069 Share on other sites More sharing options...
MmmVomit Posted March 5, 2008 Share Posted March 5, 2008 Okay. I wasn't sure about that in PHP. The manual did make mention of it, but it looked like that may have been only in earlier versions. Quote Link to comment https://forums.phpfreaks.com/topic/94532-functions-calling-functions/#findComment-484071 Share on other sites More sharing options...
phpSensei Posted March 5, 2008 Share Posted March 5, 2008 function disp_fld_names_HTML($header_list, $bgcolor = "#ffffdd") disp_fld_names_HTML($fld_names); Doesnt it need 2 arguements? Quote Link to comment https://forums.phpfreaks.com/topic/94532-functions-calling-functions/#findComment-484076 Share on other sites More sharing options...
wildteen88 Posted March 5, 2008 Share Posted March 5, 2008 function disp_fld_names_HTML($header_list, $bgcolor = "#ffffdd") disp_fld_names_HTML($fld_names); Doesnt it need 2 arguements? No the second parameter for disp_fld_names_HTML functions is optional Quote Link to comment https://forums.phpfreaks.com/topic/94532-functions-calling-functions/#findComment-484115 Share on other sites More sharing options...
wrave Posted March 5, 2008 Author Share Posted March 5, 2008 Sorry, I made a mistake in what I wrote earlier. The first two function calls inside disp_query_results_HTML() execute correctly. $fld_names = extract_fld_names($data); disp_fld_names_HTML($fld_names); But disp_query_results() doesn't continue after the second function returns. Maybe I should try putting the remaining code into yet another function and try calling it? Quote Link to comment https://forums.phpfreaks.com/topic/94532-functions-calling-functions/#findComment-484176 Share on other sites More sharing options...
phpSensei Posted March 5, 2008 Share Posted March 5, 2008 Oh sorry, i thought the 2nd arguement might be important, i see its only bg color. Anyways, try using error_reporting(E_ALL); see what it spits out Quote Link to comment https://forums.phpfreaks.com/topic/94532-functions-calling-functions/#findComment-484199 Share on other sites More sharing options...
wrave Posted March 6, 2008 Author Share Posted March 6, 2008 I don't like unanswered questions so here's what I have been doing... I now have a function that will display any arbitrary query in an HTML table except when all columns are selected in the query by using the asterisk (*). That's a problem for another day. I finally decided to extract the results table header list by extracting the field names from the query itself. So now my solution looks like this... function disp_query_results_HTML($query,$data) { //////////////////////////////////////// // REMOVE the QUERY tail. // //////////////////////////////////////// $list = preg_split("[ FROM.*]", $query); // show_array($list); //////////////////////////////////////// // REMOVE the QUERY head. // //////////////////////////////////////// $list = preg_split("[^SELECT]", "$list[0]"); // show_array($list); //////////////////////////////////////// // SPLIT the FIELD NAMES from the re- // // maining array section. // //////////////////////////////////////// $pieces = split(",",(string)$list[1]); $n = count($pieces); //echo "Count = $n<br /><br />\n"; echo "<table border=\"1\">\n"; echo "<tr>\n"; for ($i = 0; $i < $n; $i++) { echo "<th>$pieces[$i]</th>\n"; } echo "</tr>\n"; while ($row = mysql_fetch_array($data, MYSQL_NUM)) { echo "<tr>"; foreach ($row as $i => $value) { if ($value == "") { echo "<td> </td>"; } else { echo "<td>$value</td>"; } } echo "</tr>\n"; } echo "</tr></table><br />"; } This works although it bothers me that I still have the problem when all of the fields are selected. I realize this solution isn't very elegant but when you're up to your ass in alligators... Quote Link to comment https://forums.phpfreaks.com/topic/94532-functions-calling-functions/#findComment-485090 Share on other sites More sharing options...
wildteen88 Posted March 6, 2008 Share Posted March 6, 2008 PHP has a builtin in PHP function for returning field names from an SQL query. Look into the mysql_fetch_field function or mysql_field_name functions Quote Link to comment https://forums.phpfreaks.com/topic/94532-functions-calling-functions/#findComment-485135 Share on other sites More sharing options...
wrave Posted March 6, 2008 Author Share Posted March 6, 2008 Thanks. So many functions so little time to read all the docs. But I keep plugging away. At least I learned a little about the split() and preg_split() functions and a teensy bit about regex. What fun! Quote Link to comment https://forums.phpfreaks.com/topic/94532-functions-calling-functions/#findComment-485337 Share on other sites More sharing options...
wrave Posted March 7, 2008 Author Share Posted March 7, 2008 I tried using mysql_field_name() and it works but how can I determine the number of fields returned by the query? When I know the fields I can number the calls to... echo mysql_field_name($r,0); echo mysql_field_name($r,1); echo mysql_field_name($r,2); ...just like the example in the manual shows. But I want the function to be able to iterate through the query fields and I don't see how to obtain that information. Quote Link to comment https://forums.phpfreaks.com/topic/94532-functions-calling-functions/#findComment-485976 Share on other sites More sharing options...
laffin Posted March 7, 2008 Share Posted March 7, 2008 why not just use mysql_fetch_assoc? this way the array keys have the field names so a SELECT id,name,phone,zip would return an array like $row = array ('id' => '1', 'name' => 'wrave', 'phone' => '555-111-2222', 'zip' => '12345'); with a foreach($row as $key => $Val) which can give u the both key index and the value or use $fields=array_keys($row) if u need to seperate the keys from the values (Displayed as a table header) Quote Link to comment https://forums.phpfreaks.com/topic/94532-functions-calling-functions/#findComment-485989 Share on other sites More sharing options...
wrave Posted March 7, 2008 Author Share Posted March 7, 2008 Thanks laffin, I went back to the manual and found the example for mysql_fetch_field() and here is my code to build my table header... echo "<table border=1><tr bgcolor=\"#ffeedd\">"; $i = 0; while ($i < mysql_num_fields($data)) { $meta = mysql_fetch_field($data, $i); if (!$meta) { echo "No information available<br />\n"; } echo "<th> $meta->name </th>"; $i++; } echo "</tr>\n"; This handles everything. Thank you all. I didn't ever find an answer to my original question as to why the function execution halted after one of the function calls but I expect there is an error in my original code somewhere. Anyway, I now have a function that will turn a query result into an HTML table and I am quite happy to have solved tis problem. I think I can mark this topic solved. Quote Link to comment https://forums.phpfreaks.com/topic/94532-functions-calling-functions/#findComment-486046 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.