This little function stores the content of a mysql_fetch_object result into an object by using MySQL request field names as object parameters :
<?php
function FetchRequestInObject(&$obj, $req)
{
$ReqVars = get_object_vars($req);
foreach ($ReqVars as $ReqName => $ReqValue)
{
if (property_exists($obj, $ReqName))
{
$obj->$ReqName = $ReqValue;
}
}
}
?>
Remember that mysql_fetch_object is case sensitive, so beware of your object properties. Use keyword "AS" in your SQL request to change field name if necessary.
mysql_fetch_object
(PHP 4, PHP 5)
mysql_fetch_object — Liefert eine Ergebniszeile als Objekt
Beschreibung
$result
[, string $class_name
[, array $params
]] )Gibt ein Objekt mit Eigenschaften zurück, die mit der angeforderten Zeile korrespondieren, und bewegt den internen Datenzeiger vorwärts.
Parameter-Liste
-
Ergebnis -
Das Ergebnis Ressource, das ausgewertet wird. Dieses Ergebnis kommt von einem Aufruf von mysql_query().
-
class_name -
Der Name der Klasse, die instanziiert, mit Eigenschaften versehen und zurückgegeben werden soll. Wenn nicht angegeben, wird ein stdClass-Objekt zurückgegeben.
-
params -
Ein optionales Array von Parametern, die dem Konstruktor von
class_name-Objekten übergeben werden sollen.
Rückgabewerte
Gibt ein Objekt mit String-Eigenschaften zurück, die mit der angeforderten
Zeile korrespondieren, oder FALSE wenn es keine weiteren Zeilen mehr gibt.
Changelog
| Version | Beschreibung |
|---|---|
| 5.0.0 | Es wurde die Möglichkeit hinzugefügt, ein anderes Objekt zurückzugeben. |
Beispiele
Beispiel #1 mysql_fetch_object()-Beispiel
<?php
mysql_connect("hostname", "nutzer", "passwort");
mysql_select_db("meinedatenbank");
$result = mysql_query("select * from meinetabelle");
while ($row = mysql_fetch_object($result)) {
echo $row->user_id;
echo $row->vollername;
}
mysql_free_result($result);
?>
Beispiel #2 mysql_fetch_object()-Beispiel
<?php
class foo {
public $name;
}
mysql_connect("hostname", "nutzer", "passwort");
mysql_select_db("meinedatenbank");
$result = mysql_query("select name from meinetabelle limit 1");
$obj = mysql_fetch_object($result, 'foo');
var_dump($obj);
?>
Anmerkungen
Hinweis: Performanz
Unter Berücksichtigung der Ausführungsgeschwindigkeit ist diese Funktion identisch zu mysql_fetch_array() und fast so schnell wie mysql_fetch_row() (der Unterschied ist unwesentlich).
Hinweis:
mysql_fetch_object() ist ähnlich wie mysql_fetch_array(), aber mit dem Unterschied, dass ein Objekt statt eines Arrays zurückgegeben wird. Indirekt bedeutet das, dass Sie auf die Daten nur über die Feldnamen zugreifen können und nicht über die Offsets (da Zahlen keine erlaubten Namen für Eigenschaften sind).
Hinweis: Feldnamen, die von dieser Funktion zurückgegeben werden, unterscheiden sich in der Groß-/Kleinschreibung.
Hinweis: Diese Funktion setzt NULL-Felder auf den PHP Wert-
NULL.
Siehe auch
- mysql_fetch_array() - Liefert einen Datensatz als assoziatives Array, als numerisches Array oder beides
- mysql_fetch_assoc() - Liefert einen Datensatz als assoziatives Array
- mysql_fetch_row() - Liefert einen Datensatz als indiziertes Array
- mysql_data_seek() - Bewegt den internen Ergebnis-Zeiger
- mysql_query() - Sendet eine Anfrage an MySQL
mysql_fetch_object
13-May-2007 02:00
02-May-2007 09:17
Since PHP 5.2.1 it seems like this function doesn't like queries that return columns with empty names, like:
select '' from `table`
PHP exits and mysql_error() does not return an error.
22-Oct-2006 03:00
@Simon Paridon and others concerning SQL to php getting results via mysql_fetch_object:
Every query that would fail in a database frontend, such as MySQLs "Query Browser" and only will work by using the `-marks will probably give results hardly accessible in PHP especially if you have column names with "-" or " " in it.
Using the example of Simon Paridon: it is not possible to execute a query like:
SELECT id, user-id FROM unlucky_naming
only
SELECT id, `user-id` FROM unlucky_naming
will work...
so either be a bit wiser when naming the colums (e.g. user_id)
or try it with
SELECT id, `user-id` AS user_id FROM unlucky_naming
(i have not tested it in PHP yet, but i guess this will fail as well, if you have a query like "SELECT `foo name` FROM `unlucky naming 2`")
Somewhat down "amackenz at cs dot uml dot edu" mentioned to name sum, count etc. this may be a good hint for newbies: increase the speed of your php applications by using (my)sql native functions and save data transfer as well as processing time
24-Sep-2006 02:53
The behavior of this function is slightly questionable.
If you have a col in you table containing non-variable-name characters like "-", mysql_fetch_object will add "impossible variable names" to your object, e.g.
object (
[user-id] => 7
)
You can not access this variable normally with $obj->user-id, because the variable name is invalid. But you can however access it like this:
$foo = 'user-id';
echo $obj->$foo;
It will correctly output 7, whereas var_dump($obj->user-id) would output int(0) for some reason.
I got this behaviour with PHP 4.4.2.
24-Jul-2006 01:55
This is a very very elegant (and costless) way to fetch an enterie query to every single field name from a "wide" table:
The tedious way fetching:
<?php
$idtable=mysql_connect("localhost","user","pwd");
mysql_select_db("table",$idtable);
$consult=mysql_query("SELECT *
FROM models
ORDER BY Serie,Year ASC");
while($row=mysql_fetch_object($consult)){
$IdLomo=$row->IdLomo;
$Serie=$row->Serie;
$Model=$row->Model;
$Type=$row->Type;
$Year=$row->Year;
$Speed=$row->Speed;
$Power=$row->Power;
$Price=$row->Price;
$Load1=$row->Load1;
$Load2=$row->Load2;
$Load3=$row->Load3;
$Load4=$row->Load4;
$Server=$row->Servier;
$Real=$row->Real;
$Lomo=$row->Lomo;
}
?>
Resulting on 15 new variables called like their name on table wich we introduced manualy for 5 minutes. But imagine each row has 100 fields!
A way saving time with the same result:
<?php
$idtable=mysql_connect("localhost","user","pwd");
mysql_select_db("table",$idtable);
$consult=mysql_query("SELECT *
FROM models
ORDER BY Serie,Year ASC");
// We find the fields number
$numfields=mysql_num_fields($consult);
// Now we put the names of fields in a Array
for($i=0;$i<$numfields;$i++){
$fieldname[$i]=mysql_field_name($consult, $i);
}
while($row=mysql_fetch_object($consult)){
//Finally we assign the new variables
for($i=0;$i<$numfields;$i++){
$$fieldname[$i]=$row->$fieldname[$i];
}
}
?>
21-Aug-2005 10:56
This method offers a nice way to fetch objects from databases. As Federico at Pomi dot net mentioned it doesn't work native as the type of the object fetched isn't the right one, but with a small typecast it works flawlessly.
<?php
function ClassTypeCast(&$obj,$class_type){
if(class_exists($class_type)){
$obj = unserialize(preg_replace("/^O:[0-9]+:\\"[^"]+\\":/i",
"O:".strlen($class_type).":"".$class_type."\\":", serialize($obj)));
}
}
class Foo
{
var $foo;
var $bar;
function get_from_db()
{
mysql_connect();
mysql_select_db();
$res = mysql_query("SELECT foo,bar from my_table");
$fetched_object = mysql_fetch_object($res);
ClassTypeCast($fetched_object,"Foo");
$this = $fetched_object;
}
}
?>
07-Aug-2005 12:07
Watch out for mysql_fetch_object() to return all values as strings.
if you try to do
<?
$p = mysql_fetch_object($some_sql);
// and then try to do something like
$money = $p->dollars + $p->cents;
?>
You may experience "Unsupported operand types"
so always cast them both as (int) 's!!
09-Jul-2004 04:31
Some clarifications about previous notes concerning duplicate field names in a result set.
Consider the following relations:
TABLE_A(id, name)
TABLE_B(id, name, id_A)
Where TABLE_B.id_A references TABLE_A.id.
Now, if we join these tables like this: "SELECT * FROM TABLE_A, TABLE_B WHERE TABLE_A.id = TABLE_B.id_A", the result set looks like this: (id, name, id, name, id_A).
The behaviour of mysql_fetch_object on a result like this isn't documented here, but it seems obvious that some data will be lost because of the duplicate field names.
This can be avoided, as Eskil Kvalnes stated, by aliasing the field names. However, it is not necessary to alias all fields on a large table, as the following syntax is legal in MySQL: "SELECT *, TABLE_A.name AS name_a, TABLE_B.name AS name_b FROM TABLE_A, TABLE_B ...". This will produce a result set formatted like this: (id, name, id, name, id_A, name_a, name_b), and your data is saved. Hooray!
-q
16-Oct-2003 11:11
In reviewing Eskil Kvalnes's comments (04-Mar-2003 11:59
When using table joins in a query you obviously need to name all the fields to make it work right with mysql_fetch_object()) I was left asking and, as a newbie, the reason why I'm here. I have a 28 field table. Ran SELECT * with a LEFT JOIN, etc and it appears to have worked on my test server without issue.
On further reading, MYSQL.COM has the following:
* It is not allowed to use a column alias in a WHERE clause, because the column value may not yet be determined when the WHERE clause is executed. See section A.5.4 Problems with alias.
* The FROM table_references clause indicates the tables from which to retrieve rows. If you name more than one table, you are performing a join. For information on join syntax, see section 6.4.1.1 JOIN Syntax. For each table specified, you may optionally specify an alias.
Aware of the fact there's a difference between tables and fields there appears to be confusion here somewhere.
16-May-2003 03:44
Here is a wrapper that will allow specifying a class name.
function &db_fetch_object($set,$className)
{
/* Start by getting the usual array */
$row = mysql_fetch_assoc($set);
if ($row === null) return null;
/* Create the object */
$obj =& new $className();
/* Explode the array and set the objects's instance data */
foreach($row as $key => $value)
{
$obj->{$key} = $value;
}
return $obj;
}
class CPerson
{
function getFullName()
{
return $this->fname . ' ' . $this->lname;
}
}
$set = mysql_query('SELECT fname,lname FROM person');
while($person =& db_fetch_object($set,'CPerson'))
{
echo $person->getFullName();
}
04-Mar-2003 07:59
When using table joins in a query you obviously need to name all the fields to make it work right with mysql_fetch_object().
31-Jan-2003 12:50
an addition to the previous...
for example getting members from a database:
function getAllMembers () {
$query = "SELECT * FROM people ORDER BY lname";
$result = mysql_query($query);
while($member = mysql_fetch_object($result)){
$members[] = $member;
}
return $members;
}
<br><br>
DON'T FORGET TO DECLARE THE ARRAY. If you try to cycle through members after the function has been called and you don't declare the array first you will get a horribly (HORRIBLY!) ugly error in your page. Also, if you try to add the object into the members array inside the while condition instead of in the while loop, you will generate one extra empty space in the array due to the last iteration/check.
16-Jan-2003 09:28
This is probably a little more elegant:
$sql = "SELECT * FROM table ";
$result = mysql_query($sql);
$data = array();
while ($row = mysql_fetch_object($result))
$data[] = $row;
19-Nov-2002 01:14
I found the above code to be buggy, not adding all the records to the array. This is the code I used instead:
$command = "SELECT * FROM table ";
$result = mysql_query($command, $link_id);
$num = mysql_num_rows($result);
$clickthru = array();
for ($i = 0; $i <= $num; $i++) {
$clickthru[$i] = array();
$clickthru[$i] = mysql_fetch_array($result);
}
Allen
15-Sep-2002 04:41
Be carefull:
the object returned will be a new/fresh object.
You can't use this function to replace some attributes of an existing object keeping the old ones.
Example:
class person
{
var $name;
var $surname;
var $doh;
function print()
{
print($name." ".$surname);
}
function get_from_db()
{
$res=query("select name, surname from ppl where... limit 1");
$this=mysql-fetch-object($res);
}
}
This won't work! When the method get_from_db() is executed, your old object will be destroyed... you won't find anything in the attribute $doh, and if you'll try to call the method print(), it will say it doesn't exist.
15-Jan-2001 08:03
When selecting with a count/sum, the field must be named.
select count(*) from users;
becomes
select count(*) as total from users;
This way the result can be referenced as:
$row->total;