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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Désérialiser un objet provenant d'une table MySQL

par Invité » 14 oct. 2007, 14:11

Merci Traker ! :D

par Tracker » 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.

par kiki650 » 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!

par Tracker » 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.

par kiki650 » 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)

par Invité » 14 oct. 2007, 12:06

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

par Tracker » 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.

par Invité » 14 oct. 2007, 09:05

Ok merci !

par Tracker » 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.

par kiki650 » 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. !!

par Tracker » 13 oct. 2007, 22:51

J'ai essayé un peu toutes les possibilités. J'ai essayé blob et je récupére toujours la meme chose, avec les �.
Quand tu prépares l'ordre d'insertion, lors de la définition des paramètres, vérifie que tu fais:
$stmt->bindParam(':blob', serialize(...), PDO::PARAM_BLOB);
Laisse le champ en type blob dans la base.

Tracker.

par kiki650 » 13 oct. 2007, 22:36

J'ai essayé un peu toutes les possibilités. J'ai essayé blob et je récupére toujours la meme chose, avec les �.

par Tracker » 13 oct. 2007, 22:28

CREATE TABLE sessions(
id varchar(32),
access int(10),
dataobject varchar(500)
)
ALTER TABLE `sessions` ADD PRIMARY KEY (id)
Mais dataobject n'est pas un blob !!??!!??

Ecris plutot

Code : Tout sélectionner

CREATE TABLE sessions( id varchar(32), access int(10), dataobject blob )

par kiki650 » 13 oct. 2007, 22:25

CREATE TABLE sessions(
id varchar(32),
access int(10),
dataobject varchar(500)
)
ALTER TABLE `sessions` ADD PRIMARY KEY (id)

par Tracker » 13 oct. 2007, 22:21

Ca veut dire quoi en collation?
Tu peux filer le code SQL utilisé pour créer ta table contenant le blob ?

[edit]
Je ne sais pas ce que tu appelles interclassement, mais quand tu écris latin1_swedish_ci, moi je comprends:
Charset: latin1
Collation: latin1_swedish_ci
pour plus d'info va voir ici