Désérialiser un objet provenant d'une table MySQL

Eléphanteau du PHP | 11 Messages

13 oct. 2007, 23:30

Voici ma fonction:
public function _write($id, $data)
  {
    $getData = $this->db->prepare("REPLACE INTO sessions VALUES (?, ?, ?)");
    $getData->bindParam(1, $id);
    $getData->bindParam(2, $this->maxTime['access']);
    $getData->bindParam(3, serialize($data)); 
    return $getData->execute();
  }
TU peux me donner la syntaxe pour remplacer mon troisième binparam par ce que tu m'as donné bindParam(':blob', serialize($data), PDO::PARAM_BLOB);

Si je remplace ma ligne par la tienne,ca me fait planter Apache. !!

Eléphant du PHP | 443 Messages

14 oct. 2007, 06:36

En fait, le type PDO pour les blob ou clob c'est PDO::PARAM_LOB. Tu peux également tester le résultat de la méthode (boolean) PDOStatement::bindParam
public function _write($id, $data)
  {
    $getData = $this->db->prepare("REPLACE INTO sessions VALUES (?, ?, ?)");
    $getData->bindParam(1, $id);
    $getData->bindParam(2, $this->maxTime['access']);
    $getData->bindParam(3, serialize($data), PDO::PARAM_LOB); 
    return $getData->execute();
  }
A tester.
Je ferai un test ce matin pour vérifier le comportement chez moi, je te tiendrai au courant.

Bonne journée,
Tracker.

Invité
Invité n'ayant pas de compte PHPfrance

14 oct. 2007, 09:05

Ok merci !

Eléphant du PHP | 443 Messages

14 oct. 2007, 11:31

Bon voilà le test, aucun problème chez moi
config: PHP 5.1.? / MySQL 5.?

Structure SQL

Code : Tout sélectionner

CREATE TABLE sessions ( id varchar(32) not null primary key, access int(10) not null, dataobject blob not null )
Code de test
<?php
class dummy
{
	private $_server = array(); 
	public function __construct()
	{
		$this->_server = $_SERVER;
	}
}

$pdo = new PDO('mysql:host=localhost;dbname=test','root','');
if(!empty($_GET['action']) && $_GET['action']=='save')
{
	$o = new dummy();	
	$pst = $pdo->prepare('replace sessions values (:id, :access, :dataobject)');
	$pst->bindParam(':id', md5('test'));
	$pst->bindParam(':access', mktime());
	$pst->bindParam(':dataobject', serialize($o), PDO::PARAM_LOB);
	if(!$pst->execute())
		echo print_r($pdo->errorInfo());
	else
		echo 'ok';
}
else
{
	$pst = $pdo->prepare('select * from sessions where id = :id');
	$pst->bindParam(':id', md5('test'));
	if($pst->execute())
	{
		if($tab = $pst->fetch(PDO::FETCH_ASSOC))
		{
			$o = unserialize($tab['dataobject']);
			var_dump($o);
		}
	}
}
?>
Pour sauvegarder l'objet: http://...../test.php?action=save
Pour récuperer l'objet: http://...../test.php

Teste le code chez toi.
Modifié en dernier par Tracker le 14 oct. 2007, 12:42, modifié 1 fois.

Invité
Invité n'ayant pas de compte PHPfrance

14 oct. 2007, 12:06

Merci, je test ca et je te tiens au courant.

Eléphanteau du PHP | 11 Messages

14 oct. 2007, 12:20

Ecoute, je sais pas comment tu remercier.

CA marche très bien comme ca. CX'est à dire que si je fais un new de mon objet à l'endroit ou je fait mon REPLACE ca marche bien (j'aurais du essayer avant...).

Par contre, si je créer un objet dans un fichier précédent, et que j'enregistre cet objet dans ma session : $_SESSION['user'] = serialize($client). Ensuite je récupére mon $_SESSION['user'] à l'endroit du REPLACE. ==> CA, ca marche pas chez moi.

En tout cas, je te remercie pour ton aide précieuse. (je passerai moins pour un con demain au boulot)

Eléphant du PHP | 443 Messages

14 oct. 2007, 12:30

En fait j'ai l'impression que tu as sérialisé deux fois ton objet:

1- $_SESSION['user'] = serialize($client)
2- bindParam(3, serialize($data)...)
//dans ta chaine sérialisée je captais pas pourquoi tu avais le s:88
user|s:88:"O:4:"User":3:{s:3:"nom";s:2:"da";s:12:"�User�prenom";s:2:"da";s:9:"�User�tel";s:2:"23";}";

Pourquoi dans $_SESSION['user'] ne mets tu pas directement l'objet $client au lieu de le sérialiser ?

Tracker.

Eléphanteau du PHP | 11 Messages

14 oct. 2007, 12:35

En fait j'essayais de sérialiser mon objet à un autre endroit.

Ca marche très bien comme tu m'as montré en tout cas!

Eléphant du PHP | 443 Messages

14 oct. 2007, 12:56

En tout cas, je te remercie pour ton aide précieuse. (je passerai moins pour un con demain au boulot)
Pour ça y'a d'autres solutions:
- Achète un costume et des chaussures pointues 2 ou 3 pointures au dessus de la tienne.
Les gens ambitieux sont toujours fringués pareils.
- Quand tu sors de ton bureau, prend toujours un dossier avec toi.
D'un coup tu as l'air plus sérieux.
- Si on te surprend dans un couloir avec un café à la main, augmente le pas.
Ca fais genre mec affairé qui a besoin de caféïne pour se dépasser.
- Ne dis jamais que tu as un problème
La hiérarchie préfère toujours entendre un gars qui cherche des solutions...

Bon courage :wink:,
Tracker.

Invité
Invité n'ayant pas de compte PHPfrance

14 oct. 2007, 14:11

Merci Traker ! :D