Quantcast
Channel: Grafikart | Derniers Sujets du forum
Viewing all articles
Browse latest Browse all 13822

php : Développer un site Jour 5

$
0
0
Tutoriel vidéo PHP : Développer un site : Jour 5, Backoffice, à la minute 0:49:18

L'attribut "value" de la balise html "input" renvoie une chaîne vide. Pourtant, on y a placé le code PHP suivant :
$this->controller->request->data->$name

c'est donc ce code qui comporte une erreur ou des variables non définies.

Au moment de passer la requête avec :
$pre = $this->db->prepare($sql);
$pre->execute($d);
return true;


J'obtiens l'erreur suivante :
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\wamp\www\tuto\core\Model.php on line 118 (la ligne 118 est celle qui contient : "$pre->execute($d);"

Et aussi :

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number in C:\wamp\www\tuto\core\Model.php on line 118

Voici mon fichier Model.php :

<?php 
class Model{

	static $connections = array ();

	public $conf = 'default';
	public $table = false;
	public $db;
	public $primaryKey = 'id';
	
	public function __construct(){
		// J'initialise quelques variables
		if ($this->table === false){
			$this->table = strtolower(get_class($this)).'s';
		}

		// Je me connecte à la base
		$conf = Conf::$databases[$this->conf];
		if(isset(Model::$connections[$this->conf])){
			$this->db = Model::$connections[$this->conf];
			return true;
		}
		try{
			$pdo = new PDO(
				'mysql:host='.$conf['host'].';dbname='.$conf['database'].';',
				$conf['login'],
				$conf['password'],
				array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')
				);
			$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
			
			Model::$connections[$this->conf] = $pdo;
			$this->db = $pdo;
		}catch(PDOException $e){
			if(Conf::$debug>=1){
				die($e->getMessage());
			}else{
				die('impossible de se connecter à la base de données');
			}
		}

	}

	public function find($req){
		$sql = 'SELECT ';

		if(isset($req['fields'])){
			if(is_array($req['fields'])){
				$sql .= implode(', ', $req['fields']);
			}else{
				$sql .=$req['fields'];
			}
		}else{
			$sql.='*';
		}

		$sql .=' FROM '.$this->table.' as '.get_class($this).' ';

		// Construction de la condition
		if(isset($req['conditions'])){
			$sql.='WHERE ';
			if(!is_array($req['conditions'])){
				$sql.=$req['conditions'];
			}else{
				$cond = array();
				foreach ($req['conditions'] as $k=>$v) {
					if (!is_numeric($v)){
						$v = '"'.mysql_real_escape_string($v).'"';
						
					}

					$cond[]="$k=$v";
				}
				$sql .= implode(' AND ', $cond);
			}
		}

		if(isset($req['limit'])){
			$sql.='LIMIT '.$req['limit'];
		}

		$pre = $this->db->prepare($sql);
		$pre->execute();
		return $pre->fetchAll(PDO::FETCH_OBJ);
	}

	public function findFirst($req){
		return current($this->find($req));
	}

	public function findCount($conditions){
		$res = $this->findFirst(array(
			'fields' => 'COUNT('.$this->primaryKey.') as count',
			'conditions' => $conditions
			));
		return $res->count;
	}

	public function delete($id){
		$sql = "DELETE FROM {$this->table} WHERE {$this->primaryKey} = $id";
		$this->db->query($sql);
	}

	public function save($data)
	{
		$key = $this->primaryKey;
		$fields = array();
		$d = array();
		foreach ($data as $k => $v) {
			$fields[] = "$k:=$k";
			$d[":$k"] = $v;
		}
		if (isset($data->$key) && !empty($data->$key)) {
			$sql = 'UPDATE '.$this->table.' SET '.implode(',',$fields).' WHERE '.$key.'=:'.$key;
		}

		$pre = $this->db->prepare($sql);
		$pre->execute($d);
		return true;
	}
}

?>


Voilà deux jours que je galère là-dessus, et je ne trouve pas l'erreur. J'ai beau relire, revisionner la vidéo, essayer de comprendre comment tout cela s'articule, où est l'étourderie qui a pu générer cette erreur, je ne vois pas...

Quelqu'un peut-il m'aider ?




Viewing all articles
Browse latest Browse all 13822

Trending Articles