Jump to content

Recommended Posts

I am using this file with joomla. The database connection is code at the top of the php. I am getting the following error and I don't know why.

Warning: extract() [function.extract]: First argument should be an array in /usr/local/4admin/apache/vhosts/ladystestsite.com/httpdocs/php/obitdisplay.php on line 18

I have a query that is commented out and that will work, but I need the larger query to work. It has been working, but nothing has changed.

 

[attachment deleted by admin]

Link to comment
https://forums.phpfreaks.com/topic/222218-php-array-stopped-working/
Share on other sites


// Get a database object
$db = JFactory::getDBO();

//$query = "SELECT * FROM deceasedlist where ID = '$_GET[iD]'";
$query = "SELECT deceasedlist.ID, deceasedlist.DFirstName, deceasedlist.DLastName, deceasedlist.Birth, deceasedlist.Death, deceasedlist.location, deceasedlist.funeral, deceasedlist.visitation, deceasedlist.receivingplace_id, deceasedlist.funeralplace_id, deceasedlist.cemeteryplace_id, deceasedlist.funeraldate, deceasedlist.Picture, deceasedlist.Obit1, deceasedlist.Obit2, deceasedlist.Obit3, deceasedlist.Obit4, deceasedlist.Obit5, deceasedlist.Obit6, deceasedlist.Obit7, deceasedlist.Obit8, places.place_name AS funeralplace, places.address AS funeralplaceaddress, places.city AS funeralplacecity, places.state AS funeralplacestate, places.zip AS funeralplacezip, places.country AS funeralplacecountry, places_1.place_name AS receivingplace, places_1.address AS receivingplaceaddress, places_1.city AS receivingplacecity, places_1.state AS receivingplacestate, places_1.zip AS receivingplacezip, places_1.country AS receivingplacecountry, places_2.place_name AS cemeteryplace, places_2.address AS cemeteryplaceaddress, places_2.city AS cemeteryplacecity, places_2.state AS cemeteryplacestate, places_2.zip AS cemeteryplacezip, places_2.country AS cemeteryplacecountry
FROM deceasedlist
INNER JOIN places ON deceasedlist.funeralplace_id = places.place_id
INNER JOIN places AS places_1 ON deceasedlist.receivingplace_id = places_1.place_id
INNER JOIN places AS places_2 ON deceasedlist.cemeteryplace_id = places_2.place_id
WHERE deceasedlist.ID = '$_GET[iD]'";

$result = mysql_query($query)
or    die("Couldn't execute query.");
$row = mysql_fetch_array($result);
extract($row);

The query is probably returning an empty result set. You should check for that with mysql_num_rows() before trying to extract() the result. Also, why do you define $query twice? The first one is immediately overwritten by the second.

I don't have 2 queries, the first was just a sample that I had. I commented it out. At least it is suppose to be. But anyway, the recordset exists, as you must click on the name on a previous php page to get the details of the individual. If I use the query that is commented out, everything is right. But I have been using the 2nd query since March.

The error says that the parameter ($row) to extract is not an array. Since $row is assigned from mysql_fetch_array() we know it will either be an array or it will be a boolean value of false. Since it is not an array, it must be false. mysql_fetch_array() will return false if there is no row to fetch. Since mysql_query() did not error off (which would have caused the "or die()" to execute), we know that the query is syntactically correct but did not return any rows. The most likely reason would be the JOINs or the WHERE clause. Since the WHERE clause is shorter (and I don't know the table structure) we look closely at that. You have:

 

"... WHERE deceasedlist.ID = '$_GET[iD]'";

 

When you put a variable inside a double-quoted string, PHP should interpret that variable and replace it with the value. One caveat is that when the variable is complex (like an array) you have to put curly braces around the variable so PHP can recognize it and delineate it correctly. However, in this case, curly braces alone may not fix it. You have the array index as ID, unless you have a defined constant named ID somewhere above this code, that line is in error (ok, it's a warning, but those are bad, too). (I'm not sure that PHP will recognize constants in a variable in a double-quoted string, I've never tried it.) You need to put single-quotes around the ID index so PHP can correctly evaluate your variable. So that part of the query should be:

 

"... WHERE deceasedlist.ID = '{$_GET['ID']}'";

 

Having said that, I highly discourage the use of user supplied data directly in a query. This leaves you open to SQL injection attacks. You need to sanitize that value and make sure it is something you are expecting. If the deceasedlist.ID column is an integer, I would (at the very least) use something like this:

 

$id = intval($_GET['ID']);
$query = "... WHERE deceasedlist.ID = '$id'";

 

 

note: curly braces are not necessary to delineate an array value within a string. The SQL is valid as written. However, the key should definitely be quoted. $_GET['ID']

 

If you use single quotes in your array key you must use curly braces to escape it.

If I use this it works:

<?php

// Get a database object
$db = JFactory::getDBO();

$query = "SELECT * FROM deceasedlist where ID = '$_GET[iD]'";

$result = mysql_query($query)
or	die("Couldn't execute query.");
$num_results = mysql_num_rows($result);
$row = mysql_fetch_array($result);
extract($row);
?>

 

If I use this, it doesn't

<?php

// Get a database object
$db = JFactory::getDBO();

$query = "SELECT deceasedlist.ID, deceasedlist.DFirstName, deceasedlist.DLastName, deceasedlist.Birth, deceasedlist.Death, deceasedlist.location, deceasedlist.funeral, deceasedlist.visitation, deceasedlist.receivingplace_id, deceasedlist.funeralplace_id, deceasedlist.cemeteryplace_id, deceasedlist.funeraldate, deceasedlist.Picture, deceasedlist.Obit1, deceasedlist.Obit2, deceasedlist.Obit3, deceasedlist.Obit4, deceasedlist.Obit5, deceasedlist.Obit6, deceasedlist.Obit7, deceasedlist.Obit8, places.place_name AS funeralplace, places.address AS funeralplaceaddress, places.city AS funeralplacecity, places.state AS funeralplacestate, places.zip AS funeralplacezip, places.country AS funeralplacecountry, places_1.place_name AS receivingplace, places_1.address AS receivingplaceaddress, places_1.city AS receivingplacecity, places_1.state AS receivingplacestate, places_1.zip AS receivingplacezip, places_1.country AS receivingplacecountry, places_2.place_name AS cemeteryplace, places_2.address AS cemeteryplaceaddress, places_2.city AS cemeteryplacecity, places_2.state AS cemeteryplacestate, places_2.zip AS cemeteryplacezip, places_2.country AS cemeteryplacecountry
FROM deceasedlist
INNER JOIN places ON deceasedlist.funeralplace_id = places.place_id
INNER JOIN places AS places_1 ON deceasedlist.receivingplace_id = places_1.place_id
INNER JOIN places AS places_2 ON deceasedlist.cemeteryplace_id = places_2.place_id
WHERE deceasedlist.ID = '$_GET[iD]'";

$result = mysql_query($query)
or	die("Couldn't execute query.");
$num_results = mysql_num_rows($result);
$row = mysql_fetch_array($result);
extract($row);
?>

okay,

using phpMyadmin, I get this error using my long sql

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"SELECT deceasedlist.ID, deceasedlist.DFirstName, deceasedlist.DLastNam' at line 1

 

Nevermind I had an extra quote using phpmyadmin, still have my error on my webpage though.

kclark, have you checked $num_results?  You cannot extract a row unless $num_results > 0.

 

When you join tables together using "INNER JOIN", results will only exist if there is data in ALL joined tables.  If any table has the data missing, you will get nothing.

The data does exist. I put the records in and they are displayed on a page by name. You click on a name to get the FULL record. so the record has to exist in order for the name to appear in the first place. The other tables for the inner join contains records, because they are used in adding the name records as they are dynamic list boxes used in the records.

After you corrected the syntax error due to the extra quote in Reply #10, what did the query return when executed through phpmyadmin?

 

Edit: And what you do get when you echo $query, because it seems like your $_GET parameter might not contain what you expect. Perhaps you are forming links that have white-space or non-printing characters that would result in a FALSE where term.

 

Edit2: Also, what does var_dump($_GET[iD]); show?

When I  use this:

var_dump($_GET[iD]);

I get this:

string(6) "120902"

 

When I  use this:

echo $query

I get this:

SELECT deceasedlist.ID, deceasedlist.DFirstName, deceasedlist.DLastName, deceasedlist.Birth, deceasedlist.Death, deceasedlist.location, deceasedlist.funeral, deceasedlist.visitation, deceasedlist.receivingplace_id, deceasedlist.funeralplace_id, deceasedlist.cemeteryplace_id, deceasedlist.funeraldate, deceasedlist.Picture, deceasedlist.Obit1, deceasedlist.Obit2, deceasedlist.Obit3, deceasedlist.Obit4, deceasedlist.Obit5, deceasedlist.Obit6, deceasedlist.Obit7, deceasedlist.Obit8, places.place_name AS funeralplace, places.address AS funeralplaceaddress, places.city AS funeralplacecity, places.state AS funeralplacestate, places.zip AS funeralplacezip, places.country AS funeralplacecountry, places_1.place_name AS receivingplace, places_1.address AS receivingplaceaddress, places_1.city AS receivingplacecity, places_1.state AS receivingplacestate, places_1.zip AS receivingplacezip, places_1.country AS receivingplacecountry, places_2.place_name AS cemeteryplace, places_2.address AS cemeteryplaceaddress, places_2.city AS cemeteryplacecity, places_2.state AS cemeteryplacestate, places_2.zip AS cemeteryplacezip, places_2.country AS cemeteryplacecountry FROM deceasedlist INNER JOIN places ON deceasedlist.funeralplace_id = places.place_id INNER JOIN places AS places_1 ON deceasedlist.receivingplace_id = places_1.place_id INNER JOIN places AS places_2 ON deceasedlist.cemeteryplace_id = places_2.place_id WHERE deceasedlist.ID = '120902'

 

But I still have this error on my page:

Warning: extract() [function.extract]: First argument should be an array in file location on line 17

Here is my whole page

<?php

// Get a database object
$db = JFactory::getDBO();


$query = "SELECT deceasedlist.ID, deceasedlist.DFirstName, deceasedlist.DLastName, deceasedlist.Birth, deceasedlist.Death, deceasedlist.location, deceasedlist.funeral, deceasedlist.visitation, deceasedlist.receivingplace_id, deceasedlist.funeralplace_id, deceasedlist.cemeteryplace_id, deceasedlist.funeraldate, deceasedlist.Picture, deceasedlist.Obit1, deceasedlist.Obit2, deceasedlist.Obit3, deceasedlist.Obit4, deceasedlist.Obit5, deceasedlist.Obit6, deceasedlist.Obit7, deceasedlist.Obit8, places.place_name AS funeralplace, places.address AS funeralplaceaddress, places.city AS funeralplacecity, places.state AS funeralplacestate, places.zip AS funeralplacezip, places.country AS funeralplacecountry, places_1.place_name AS receivingplace, places_1.address AS receivingplaceaddress, places_1.city AS receivingplacecity, places_1.state AS receivingplacestate, places_1.zip AS receivingplacezip, places_1.country AS receivingplacecountry, places_2.place_name AS cemeteryplace, places_2.address AS cemeteryplaceaddress, places_2.city AS cemeteryplacecity, places_2.state AS cemeteryplacestate, places_2.zip AS cemeteryplacezip, places_2.country AS cemeteryplacecountry
FROM deceasedlist
INNER JOIN places ON deceasedlist.funeralplace_id = places.place_id
INNER JOIN places AS places_1 ON deceasedlist.receivingplace_id = places_1.place_id
INNER JOIN places AS places_2 ON deceasedlist.cemeteryplace_id = places_2.place_id
WHERE deceasedlist.ID = '$_GET[iD]'";

$result = mysql_query($query)
or    die("Couldn't execute query.");
$row = mysql_fetch_array($result);
//extract($row);This is the line that is giving me problems

echo $row['ID'];This line returns the correct ID # that was passed from previous page.

var_dump($_GET[iD]);This line repeats my sql statement with the correct ID # in the ID equals statement

print "<center>
<table width=\"400\">
<tr><td>";
print "<form action='./sendcondolence?ID=$ID' method=\"post\" name=\"FormName\"><input type=\"submit\" value=\"Send A Condolence\" border=\"0\"></form></td><td><form action='./condolences?ID=$ID' method=\"post\" name=\"FormName\"><input type=\"submit\" value=\"View Condolences\" border=\"0\"></form></td>
</tr>
</table>
</center><br><br><center>";

if($Picture == "") print "";if($Picture != "") print "<img src=\"$Picture\" alt=\"$DFirstName $DLastName\" height=\"169\" width=\"133\" border=\"0\"><br>";
print "<b>$DFirstName $DLastName</b></center>";
print "<br><br>
<b>Born</b>: "; print date('F j, Y',strtotime($Birth));
print "<br>
<b>Died</b>: "; print date('F j, Y',strtotime($Death));
print "<br><br>";
print $Location;
print "<br><br>";

$today=date("Y-m-d");

if ($receivingplace_id > 0 && $funeraldate >= $today)
print $visitation;


if ($receivingplace_id >= 1 && $funeraldate >= $today)
print " <a href=\"http://www.mapquest.com/maps/map.adp?city=".$receivingplacecity."&state=".$receivingplacestate."&address=".$receivingplaceaddress."&zip=".$receivingplacezip."&country=".$receivingplacecountry."&zoom=9\" target=\"_blank\"><u>" .$receivingplace. " (map/directions)</u></a><br>";

if ($funeralplace_id > 0 && $funeraldate >= $today)
print $funeral;

if ($funeralplace_id > 1 && $funeraldate >= $today)
print " <a href=\"http://www.mapquest.com/maps/map.adp?city=".$funeralplacecity."&state=".$funeralplacestate."&address=".$funeralplaceaddress."&zip=".$funeralplacezip."&country=".$funeralplacecountry."&zoom=9\" target=\"_blank\"><u>" .$funeralplace. " (map/directions)</u></a><br>";

if ($cemeteryplace_id > 0 &&$funeraldate >= $today)
print "Cemetery Location:";

if ($cemeteryplace_id > 1 && $funeraldate >= $today)
print " <a href=\"http://www.mapquest.com/maps/map.adp?city=".$cemeteryplacecity."&state=".$cemeteryplacestate."&address=".$cemeteryplaceaddress."&zip=".$cemeteryplacezip."&country=".$cemeteryplacecountry."&zoom=9\" target=\"_blank\"><u>" .$cemeteryplace. " (map/directions)</u></a><br>";

print "<br><br>
<html><body background=\"../../Obit Pics/veteran.jpg\"><p align=\"justify\">$Obit1
<br><br>
$Obit2
<br><br>
$Obit3
<br><br>
$Obit4";
if($Obit5 == "") print "";

if($Obit5 != "") print "<br><br>$Obit5";

if($Obit6 == "") print "";

if($Obit6 != "") print "<br><br>$Obit6";

if($Obit7 == "") print "";

if($Obit7 != "") print "<br><br>$Obit7";

if($Obit8 == "") print "";

if($Obit8 != "") print "<br><br>$Obit8";

print "</p></body></html>";

?>

Since you are able to echo $row['ID'] and get a value, that means that $row does contain an array (at some point in time.)

 

Either -

 

A) Your page or just that code is being requested/included twice and the second time there is no $_GET['ID'] present and the query matches zero rows, or

 

B) extract() does not like the numeric/associative array that mysql_fetch_array() returns. You can try mysql_fetch_assoc() or why not just use the $row['name'] variables and forget about using extract().

Let's see exactly what the $row array contains.

 

$result = mysql_query($query)
or    die("Couldn't execute query.");
$row = mysql_fetch_array($result);

// Add the following three lines as shown.
echo '<pre>';
print_r($row);
echo '</pre>';

//extract($row);This is the line that is giving me problems

Did you ever successfully execute the long query directly using phpmyadmin, with an id value that does not work using php?

 

At this point, I would say your problem is -

When you join tables together using "INNER JOIN", results will only exist if there is data in ALL joined tables.  If any table has the data missing, you will get nothing.

 

Perhaps you have some white-space/non-printing characters in some of the data in the columns you are joining on and those columns don't match each other exactly.

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.