requete mysql en php

Doogy1st
Invité n'ayant pas de compte PHPfrance

14 août 2010, 19:36

Salut à tous. J'ai un petit problème. Il s'agit d'un formulaire d'insertion d'article dans ma base de données. Mais ça marche pas (aucun changement dans la base) sans pour autant afficher d'erreur! Comment je fais pour corriger maintenant! :(
Voici le code:
                        /*Connection à la base de données et affichage d'erreur s'il y a*/
			try { $bdd = new PDO ('mysql:host=localhost;dbname=legrain','root',''); }
			catch (Exception $e) { die ('Erreur de connexion à la base: '.$e->getMessage()); }
		
		
		if ( isset($_POST['type']) && $_POST['type'] != '' && isset($_POST['sujet']) && $_POST['sujet'] != '' && 
                            isset($_POST['auteur']) && $_POST['auteur'] != '' &&     isset($_POST['contenu']) && $_POST['contenu'] != '')
		{
			if ( $_POST['type'] == 'astuces' || $_POST['type'] == 'liens')
			{
				/* Actualisation de la base pour le nouvel article qui vient d'être envoyé*/
			
				$register = $bdd->prepare('INSERT INTO :type (sujet,auteur,date_creation,contenu) VALUES (:sujet, :auteur, NOW(), :contenu)')
                                                                                   or die (print_r($bdd->errorInfo()));
				$register->execute(array(
							'type' => htmlspecialchars($_POST['type']),
							'sujet' => htmlspecialchars($_POST['sujet']),
							'auteur' => htmlspecialchars($_POST['auteur']),
							'contenu' => htmlspecialchars ($_POST['contenu']),
							));
				$register->CloseCursor();
				/*Redirection vers le nouveau sujet*/
				$id = $bdd -> lastInsertId();
				header('Location: ../../'.$_POST['type'].'.php?id='.$id);
			}
			
			else 
			{
				if (( $_POST['type'] == 'articles' || $_POST['type'] == 'biographies') && (isset($_POST['entete']) && $_POST['entete'] != '' ))
				{
					/* Actualisation de la base pour le nouvel article qui vient d'être envoyé*/
				
					$register = $bdd->prepare('INSERT INTO :type (sujet,auteur,date_creation, entete, contenu) 
                                                               VALUES (:sujet, :auteur, NOW(), :entete, :contenu)') or die (print_r($bdd->errorInfo()));
					$register->execute(array(
								'type' => htmlspecialchars($_POST['type']),
								'sujet' => htmlspecialchars($_POST['sujet']),
								'auteur' => htmlspecialchars($_POST['auteur']),
								'entete' => htmlspecialchars($_POST['entete']),
								'contenu' => htmlspecialchars ($_POST['contenu']),
								));
					$register->CloseCursor();
				/*Redirection vers le nouveau sujet*/
				$id = $bdd -> lastInsertId();
				header('Location: ../../'.$_POST['type'].'.php?id='.$id);
				}
				else
				{
					echo 'Ce type d\'article n\'existe pas!';
					include_once('myeditor.html');
				}
			}
		}
		else
		{
			include_once('myeditor.html');
		}
				
?>
Merci d'avance. 8-|

Doogy1st
Invité n'ayant pas de compte PHPfrance

14 août 2010, 19:59

J'ai trouvé le problème mais je sais pas encore comment le résoudre.
Il s'agit de ':type' dans la requete prepare. Elle n'est pas remplacée par sa valeur lors de l'appel de execute.

ViPHP
xTG
ViPHP | 7331 Messages

14 août 2010, 20:11

C'est peut être un mot réservé.
Essayes de le changer par un autre mot dont tu seras sûr qu'il n'est pas utilisé par le SGBD.

ViPHP
ViPHP | 5462 Messages

14 août 2010, 20:22

ca marche pas comme ca :wink:
les requêtes préparé c'est que sur les valeur de requête (VALUE, SET, WHERE....) après le FROM (en gros)

pourquoi ?
parce que mysql optimise la requête par rapport a la table donc il a besoin de savoir quelle table ;)

Doogy1st
Invité n'ayant pas de compte PHPfrance

22 août 2010, 18:21

Merci stealth35 :) . Effectivement on ne peut pas avoir un nom de table variable. En fait je voulais celà parce que j'ai plusieurs tables qui ont un certain nombre de champs en commun #-o . Et là je n'avais plus que deux solutions:
1) Utiliser une requête pour chaque table;
2) Optimiser ma base pour n'avoir qu'une seule table ( ça sera un peu le brouhaha mais bon! )
J'ai opté pour la première solution, ma priorité étant la clarté.
Merci bien à tous et really sorry pour le retard 8-|.

ViPHP
ViPHP | 5462 Messages

23 août 2010, 00:02

Merci stealth35 :) . Effectivement on ne peut pas avoir un nom de table variable. En fait je voulais celà parce que j'ai plusieurs tables qui ont un certain nombre de champs en commun #-o . Et là je n'avais plus que deux solutions:
1) Utiliser une requête pour chaque table;
2) Optimiser ma base pour n'avoir qu'une seule table ( ça sera un peu le brouhaha mais bon! )
J'ai opté pour la première solution, ma priorité étant la clarté.
Merci bien à tous et really sorry pour le retard 8-|.
rien ne t'empêche de mettre une variable dans ta requête :wink:
SELECT * FROM $matable WHERE machin = ?

Petit nouveau ! | 3 Messages

23 août 2010, 22:08

Ok, mais c'est comment la syntaxe exacte sachant qu'on est en php et que j'utilise PDO.
$register = $bdd->prepare('SELECT * FROM '.$ma_table.' WHERE machin = ?');
...
Parce que la syntaxe ci dessus ne marche pas apparemment.
???

Merci.

ViPHP
ViPHP | 5462 Messages

23 août 2010, 23:52


Petit nouveau ! | 3 Messages

24 août 2010, 02:23

ça marche bien effectivement. Une erreur de ma part. Merci bien.