0

Hello there!

I am new with PDO and I am trying to replace the old code with PDO...

The main issue i have is that i dont know how to get/use the objects vs the arrays when it comes to showing data.

Please see bellow examples and let me know if you can help.

CURRENT/OLD CODE:

class customer 
{
    function getCustomer($customer_id) 
    {
        $Sql = "SELECT * FROM customer WHERE customerID=".mysql_real_escape_string($customer_id);
        $Res = @mysql_query($Sql);
        $Row = @mysql_fetch_array($Res);
        $this->Name 		= ucfirst(($Row['Name']));
        $this->Email 		= ucfirst(($Row['Email'])); 
    return $Row;
    }
}

and in order to use the class i do the following:

//initiate the class
$Customer = new customer;
$Customer -> getCustomer($_GET[customer_id]);
echo $Customer->Name;
echo $Customer->Email;

i also use the code this way when i need forms:

<input name="customer_name" type="text" value="<?=$Customer->Name?>" />

SO...NEED SOME HELP BELOW...

I am learing PDO and i am trying to replace the old code (like the one above) with the new one, but i am not sure i am doing the right things...please see bellow:


NEW CODE:

//db coonection
$db = new PDO("mysql:host=$db_host;dbname=$db_name",$db_user,$db_pass);
class customer 
{
	function __construct($db)
	{	
	  	$this->db = $db;
	}

    function getCustomer($customer_id) 
    {
        $Sql 	= "SELECT * FROM customer WHERE customerID=".mysql_real_escape_string($customer_id);
		$rs		= $this->db->query($sql);
		//$row 	= $rs->fetch(PDO::FETCH_ASSOC);
        $row 	= $rs->fetch(PDO::FETCH_OBJ);
    return $row;
    }
}
//initiate the class
$Customer = new customer;

question:
1-how can i use the Name and Email as the example shown above?

could I the following?

//initiate the class
$Customer = $Customer -> getCustomer($_GET[customer_id]);
echo $Customer->Name;
echo $Customer-Email;

How do you guys use it?
Sorry if i am not very clear! :)

3
Contributors
3
Replies
4
Views
5 Years
Discussion Span
Last Post by veedeoo
1

I use a pdo wrapper class form here:

http://code.google.com/p/php-pdo-wrapper-class/

You don't need to use mysql_real_escape_string with is as it uses parametric binding.

The documentation is a little thin, but adding it to a project is straightforward. The setErrorCallbackFunction is a bit of a fiddle to get working though.

Edited by diafol: n/a

1

this code is already a loop over

$row 	= $rs->fetch(PDO::FETCH_OBJ);

meaning, the objects can be called like this

echo $row->Name; and echo $row->Email;

However, if those objects are needed to be called through the instantiation of the class without being printed or echoed within the class, it may cost a little bit of server resources. Memory wise, but not a lot :).

We need to pass the obj to something else that we can call during the class instantiation. Not the best choice, but this is all I can think of right now.

Let's expand your code a little

## remember this is a loop over
$row = $rs->fetch(PDO::FETCH_OBJ);

## let's assign them
$item['name'] = (string)$row->name; 
## Warning name is case sensitive which pertains to your database column name.
## let's set the next one email
$item['email'] = (string)$row->email;

$output[] = $item;
return $output;

Now, this is not a very clever thing to do, but since we don't want to print anything inside the function and within the class, I guess it is ok to do this. This is like a double jeopardy, because we already spent some memory on the loop over and will be spending the same amount for the foreach loop below

## instantiate the clas here
## call your function $something = $Customer -> getCustomer($_GET[customer_id]);

now the part that I don't like

foreach($something as $info){
  
echo $info['name']."<br/>";
echo $info['email']."<br/>";

}

Edited by veedeoo: n/a

0

ok, after giving this question much thoughts over a gallon of starbucks coffee, I decided to write and test based on the environment similar to the question.

This script uses a class, and then utilizing the PDO FETCH_CLASS. So, instead of investing some memory twice for the return of one, we will utilize the FETCH_CLASS by PDO, which is deemed to be the only way of doing things properly.

Feel free to modify this script for your needs.. I tested it under the php 5.X environment and it is working the way I expected it to be.

Here you have it.. the script is well commented. Please ignore the Morpheus an Neo thing, I just got carried away.. :)

<?php
## once again this script is written by PoorBoy or veedeoo.
## for whatever it's worth, feel free to use it.

class video{
## warning this $title refers to the database table column "title"
public $title;
## same as above
public $remotethumb;
## same as the two variables above
public $tags;
## assign description
public $description;
## This will be the output, either  print or echo which I always prefered
## of course we can do anything with the variables as declared above.
public function echo_something(){
## make the title red
$red ="";
$red .='<b style="color:red;">'.$this->title.'</b><br/>';
$red .='<b style="color:navy;">'.$this->description.'</b><br/>';
## if we want to add more values from the query, we can always do so by extending $red variables.
## in fact, we can even use this class to ouput a thumbnail base on the url of the thumbnails from the media table..
$red .= '<img src="'.$this->remotethumb.'"/><br/>';
 return $red;
}

} 
## settings.inc is a file where the database user, password, and db name is located.
## they are defined as follows; $db_host = "localhost";$db_user = "username"; $db_password = "db password";$db_database = "dbName";
include_once 'includes/settings.inc';

try {
    $someDb = new PDO("mysql:host=$db_host;dbname=$db_database", $db_user, $db_password);
   ## double check and make sure we are connected. If we are, tell Morpheous and Neo about it, well yah.
   ## remove this in production site. we don't want the agents to know we are connected with Morpheus and Neo :).
    echo 'Yes, we are connected Morpheous and Neo!<br />';

   ## define our connection query
   ## don't forget to change media to your database table.
   $query = "SELECT * FROM media WHERE category='Pink Floyd' ";

    ## prepare to fetch PDOStatement objects 
    $pdoObject = $someDb->query($query);

    ## Now, fetch that class video above. using the FETCH_CLASS pdo object.
    $obj = $pdoObject->fetchALL(PDO::FETCH_CLASS, 'video');

  ## Unlike my first not so good example this will only take place once, and not twice.
    foreach($obj as $video)
        {
     ## remember the echo_something in our class video above? This is where we can call it.
        echo $video->echo_something().'<br />';
        } 
    ## I think it will be worth it if we close whatever we opened to complete our operation. Codes below can do just that.
    $someDb = null;
}
## We can either eliminate these remaining two lines below if needed be, but it is highly necessary when testing your class or the script.
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
?>

Remember though.. this

try {

## some stuffs here

}

is not mandatory, but it is nice to be there. It will truly help people to write better codes. Especially for the templating environment like smarty, dwoo and others.

Edited by veedeoo: n/a

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.