[Résolu] Requête d'insertion impossible

Eléphanteau du PHP | 11 Messages

16 oct. 2011, 18:36

Bonjour tout le monde !

Après un week-end passé à chercher une solution, que ce soit de moi-même ou bien sur internet, je viens dans le plus grand désespoir vous demander votre aide.
J'ai créé un panneau d'administration à partir duquel il est possible d'uploader une image à partir de son ordinateur.
Mon script consiste à enregistrer l'image dans le FTP, ainsi que les informations liées dans la base de donnée.
Je vérifie donc l'intégralité et la validité de l'image et des informations avant d'exécuter le script.

Une fois la condition remplie, le fichier chargé est correctement enregistré à l'endroit voulu mais la requête SQL pour enregistrer les informations ne fonctionne pas.
Aucun élément n'est ajouté à la base de donnée ...

Voici mon script
<?php
if(!empty($_POST['title']) && !empty($_POST['cat_id']) && isset($_FILES['img']) && $_FILES['img']['error'] == 0)
	{
		$imgtitle = secure($_POST['title']);
		$imgcatid = intval($_POST['cat_id']);
		$imgdescription = !empty($_POST['description'])?secure($_POST['description']):'';
		
		$fileinfo = pathinfo($_FILES['img']['name']);
		$ext_upload = $fileinfo['extension'];
		$ext_allowed = array('jpg', 'jpeg', 'gif', 'png', 'psd');
		
		if (in_array($ext_upload, $ext_allowed))
		{
			move_uploaded_file($_FILES['img']['tmp_name'], 'images/gallery/' . basename($_FILES['img']['name']));
		
			$req = $bdd->prepare('INSERT INTO gallery(id, cat_id, title, description, before, after) VALUES(:id, :cat_id, :title, :description, :before, :after)');
			$req->execute(array(
				'id' => '',
				'cat_id' => $imgcatid,
				'title' => $imgtitle,
				'description' => $imgdescription,
				'before' => '',
				'after' => "images/gallery/".$_FILES['img']['name']
				));
				
			header('Location: admin.php?g=gallery');
		}
	}
?>
Et encore un autre test que j'ai fais :
<?php 
	if(!empty($_POST['title']) && !empty($_POST['cat_id']) && isset($_FILES['img']) && $_FILES['img']['error'] == 0)
	{
		$imgtitle = secure($_POST['title']);
		$imgcatid = intval($_POST['cat_id']);
		$imgdescription = !empty($_POST['description'])?secure($_POST['description']):'';
		$imgafter = $_FILES['img']['name'];
		$imgbefore = $_FILES['img_before']['name'];
		
		$fileinfo = pathinfo($_FILES['img']['name']);
		$ext_upload = $fileinfo['extension'];
		$ext_allowed = array('jpg', 'jpeg', 'gif', 'png', 'psd');
		
		if (in_array($ext_upload, $ext_allowed))
		{
			move_uploaded_file($_FILES['img']['tmp_name'], 'images/gallery/' . basename($_FILES['img']['name']));
			
			$req = $bdd->prepare('INSERT INTO gallery(cat_id, title, description, before, after) VALUES(:cat_id, :title, :description, :before, :after)');
			$req->bindParam(':cat_id',$imgcatid);
			$req->bindParam(':title',$imgtitle);
			$req->bindParam(':description',$imgdescription);
			$req->bindParam(':before',$imgbefore);
			$req->bindParam(':after',$imgafter);
			$req->execute();
		}
	}
?>
A noter que :
- Je suis bel et bien connecté à la base de donnée
- Lorsque j'active le report d'erreurs PDO, il me retourne un array(0=>0000, 1=>, 2=>)

Voilà la structure de ma table "gallery" :

Image

Merci d'avance pour votre aide !
Bonne fin de journée et de week-end ;)
Modifié en dernier par Yunge le 16 oct. 2011, 21:10, modifié 1 fois.

Eléphanteau du PHP | 44 Messages

16 oct. 2011, 20:00

Bah oui, tes 2 requêtes sont fausses.
int PDO::exec ( string $statement )
Et pour bindParam, si tu précises pas que tes chaines sont des strings ( PDO::PARAM_STR), y'aura une erreur.

D'ailleurs tu devrais normalement en obtenir une, si du moins ta requête est exécutée.

Eléphanteau du PHP | 11 Messages

16 oct. 2011, 20:25

Merci pour ta réponse, si je comprends bien dans mon cas je dois utiliser la fonction exec, et non execute ?

EDIT :

C'est bon ça marche, j'ai apporté quelques modifications à la requête préparée et aux binds :

Avant :
<?php
                        $req = $bdd->prepare('INSERT INTO gallery(cat_id, title, description, before, after) VALUES(:cat_id, :title, :description, :before, :after)');
                        $req->bindParam(':cat_id',$imgcatid);
                        $req->bindParam(':title',$imgtitle);
                        $req->bindParam(':description',$imgdescription);
                        $req->bindParam(':before',$imgbefore);
                        $req->bindParam(':after',$imgafter);
                        $req->execute();
?>
Après :
<?php
			$req = $bdd->prepare('INSERT INTO gallery VALUES("", :cat_id, :title, :description, :before, :after)');
			$req->bindParam(':cat_id',$imgcatid, PDO::PARAM_INT);
			$req->bindParam(':title',$imgtitle, PDO::PARAM_STR);
			$req->bindParam(':description',$imgdescription,  PDO::PARAM_STR);
			$req->bindParam(':before',$imgbefore,  PDO::PARAM_STR);
			$req->bindParam(':after',$imgafter,  PDO::PARAM_STR);
			$req->execute();
?>
Merci beaucoup pour ton aide !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 oct. 2011, 21:26

Et pour bindParam, si tu précises pas que tes chaines sont des strings ( PDO::PARAM_STR), y'aura une erreur.

D'ailleurs tu devrais normalement en obtenir une, si du moins ta requête est exécutée.
pour info http://fr2.php.net/manual/fr/pdostatement.bindparam.php

si tu ne précise pas le 3ème paramètres c'est considéré comme une chaine de caractère.

c'est justement si ta donnée n'est pas une chaine de caractère qu'il faut le préciser :mrgreen:


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 11 Messages

16 oct. 2011, 23:39

Merci pour la précision ! Une dernière chose, est-ce qu'une âme bienveillante saurait m'expliquer ce qui est faut dans ma toute première requête ? J'ai beau essayer de comprendre, je n'y arrive pas.

Merci ;)