Page 1 sur 1

pb insertion dans une table

Posté : 13 juil. 2011, 14:08
par touhatahtouha
salut
j'ai créer cette page formulaire gproduit

Code : Tout sélectionner

<form method="POST" name=fp action='gpdt.php'> Référence <input type="text" name="ref" size="20> Libellé<input type="text" name="lib" size="20"></font></td> <p><input type="submit" value="Enregistrer" name="enreg"><input type="submit" value="Supprimer" name="supp"><input type="reset" value="Annuler" name="reset"></p> </form>
la page gpdt.php

Code : Tout sélectionner

<?php include 'produit.php'; if (isset($_POST['ref'])&& isset($_POST['lib'])&& isset($_POST['enreg'])) { $a1=$_POST['ref']; $a2=$_POST['lib']; $p=new produit($a1,$a2); $p->ajouter(); header ('location: gproduit.php'); } ?>
la page produit.php

Code : Tout sélectionner

<?php include 'connection.php'; class produit { public $codep; public $lib; public function produit( $codep,$lib) { $this->codep= $codep; $this->lib=$lib; } public function testerSiExiste() { $req = "SELECT lib FROM produit WHERE codep_v = ".$this->codep.";"; $res=odbc_exec( $conn,$req )or die ("existe"); if( odbc_num_rows( $res ) != 0 ) { return true;} } public function ajouter() { $requete="insert into produit_vente values ( ".$this->codep.",'".$this->lib."'.");"; $resultat=odbc_exec( $conn,$requete )or die ("pb insertion "); }} ?>
quand j'exécute le formulaire rien ne se passe
par contre si j'écris dans la page gpdt.php le code d'insertion directement ça passe

je ne sais pas pourquoi la fonction ajouter ne fonctionne pas et je n'ai pas pu localiser l'erreur?

Re: pb insertion dans une table

Posté : 13 juil. 2011, 15:28
par xTG
Problème de portée de variable.
Tes variables de connexions n'existent pas dans la fonction. Si tu avais les erreurs PHP activées il te l'aurait gentiment craché à la figure. ;)

Il faut par un moyen ou un autre passer les informations de connexion à ta class.
- Paramètre de fonction
- variable global
- class de connexion en singleton

Re: pb insertion dans une table

Posté : 13 juil. 2011, 20:31
par touhatahtouha
merci pour la réponse.
mais pour la connexion j'ai pas de problème, j'ai utilisé 'include connection.php' bon ce n'est pas une classe!
le même code je l'ecris

Code : Tout sélectionner

$requete="insert into produit_vente values ( ".$this->codep.",'".$this->lib."'." );"; 27. $resultat=odbc_exec( $conn,$requete )or die ("pb insertion " );
non pas dans la classe il sera exécuté sans pb mais lorsque j'utilise la fonction ajouter il ne se passe rien même pas un message d'erreur :roll:

Re: pb insertion dans une table

Posté : 15 juil. 2011, 16:06
par moogli
Ajoute error_reporting(-1); en 1ère ligne pour les messages d'erreurs.

A tu compris le système de portée des variables ?
En gros une variable déclarée en dehors d'une fonction n'est pas accessible dans la fonction !

Suis donc les conseils de xtg ;)

@+

Re: pb insertion dans une table

Posté : 16 juil. 2011, 13:14
par Skw33d

Re: pb insertion dans une table

Posté : 26 juil. 2011, 13:56
par abdelseo
oui je pense aussi que c'est un problème de variable
voici un exemple:
<?php
/* 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
require_once('config.php');
/**
 * Description of GestionBdd
 *
 * @author abdel
 */
class GestionBdd {
 

        private $connexion;
	public  $last_query;
	private $magic_quotes_active;
	private $real_escape_string_exists;
        
    public function  __construct() {
        $this->ouvrir_connexion();
        $this->magic_quotes_active = get_magic_quotes_gpc();
        $this->real_escape_string_exists = function_exists( "mysql_real_escape_string" );
    }
    public function ouvrir_connexion(){
        $this->connexion  = mysql_connect(DB_SERVER,DB_USER,DB_PASS);
        if(!$this->connexion){
            die("Erreur lors de la connexion avec la base de donnée : " . mysql_error());
        }
        else{
            $db_select = mysql_select_db(DB_NAME, $this->connexion);
            if (!$db_select){
                die("Erreur lors de la sélection la base de donnée: " . mysql_error());
                }
            }
    }

    public function query($sql) {
            $this->last_query = $sql;
            $result = mysql_query($sql, $this->connexion);
            $this->confirm_query($result);
            return $result;
    }
        
   // d'autre fonction ....

$bdd    =   new GestionBdd();
?>
je partagerai la class un autre jour une fois il sera complète.
alors après l'include il faut faire
	public static function count_all() {
	  global $bdd;
	  $sql = "SELECT COUNT(*) FROM ".self::$table_name;
    $result_set = $bdd->query($sql);
	  $row = $bdd->fetch_array($result_set);
    return array_shift($row);
	}
voila j'espère que j'ai détaillé un peu ce qui as été déja dis et que peut être que sa va t'aider un peu ;)

Re: pb insertion dans une table

Posté : 26 juil. 2011, 14:46
par moogli
voila j'espère que j'ai détaillé un peu ce qui as été déja dis et que peut être que sa va t'aider un peu ;)
heu on utilise pas des constantes dans une classe hein, où est la portabilité de la chose ?

tu vérifier même pas qu'elle existe ces constantes.

utilise plutot le constructeur pour passer les infos de connexion au SGBD.

Mais bon maintenant que, presque, tout le monde passe a php5 il serait plutôt utile de passer à PDO :)


@+

Re: pb insertion dans une table

Posté : 26 juil. 2011, 17:35
par abdelseo

heu on utilise pas des constantes dans une classe hein, où est la portabilité de la chose ?
les constantes sont pas dans la classes sont ici config.php mais c'est discutable en tout cas à ma connaissance on a le droit de définir des constantes dans une classe.

Pour la PDO je te l'accorde mais ça reste un exemple ce que je viens de donner

Re: pb insertion dans une table

Posté : 27 juil. 2011, 04:04
par moogli
public function ouvrir_connexion(){
$this->connexion = mysql_connect(DB_SERVER,DB_USER,DB_PASS);

moogli a écrit:
heu on utilise pas des constantes dans une classe hein, où est la portabilité de la chose ?

j'ai bien dit utilisé, et pour la raison simple du fait que tu ne sais même pas si les constantes existe.

bien sur tu peux le faire, tout comme tu peut utiliser les magic_quote, ou rouler à 200km/h avec ta voiture, mais ce n'est pas parce que tu peux que tu doit ;)

un objet est, normalement, étanche. J'entend par la que tous ce qui se passe à l'intérieur n'utilise que des choses bien a lui, donc des attributs de classe etc.
On lui donne a manger ce dont il a besoin pour fonctionner, via des setter / getter ou le constructeur ou en appelant une méthode.

mais dans tous les cas une valeur qui viens de "nulle part" doit être contrôlée, au minimum sur son existence.

avec ta classe, si les constantes ne sont pas définie ça ne fonctionnera pas ;)

(dans l'absolue on devrait aussi tester si l'extension est bien en service et sit les fonctions que l'on souhaite utilisée sont bien définie et utilisable avant de faire quoi que ce soit :mrgreen: )

@+

Re: pb insertion dans une table

Posté : 27 juil. 2011, 12:04
par abdelseo
j'ai bien dit utilisé, et pour la raison simple du fait que tu ne sais même pas si les constantes existe.
comment ça je sais pas si ça existe :oops: , la honnetement tu cherche a compliquer les choses, le fichier config.php la ou il y a les constantes c'est définie à la main dont voici le contenu

Code : Tout sélectionner

<?php // Database Constants defined('DB_SERVER') ? null : define("DB_SERVER", "localhost"); defined('DB_USER') ? null : define("DB_USER", "xxxxx"); defined('DB_PASS') ? null : define("DB_PASS", "xxxxx"); defined('DB_NAME') ? null : define("DB_NAME", "xxxxx"); ?>
après c'est un choix tu peux ajouter une couche pour vérifier mais dans notre cas je vois vraiment pas l'intérêt .
mais dans tous les cas une valeur qui viens de "nulle part" doit être contrôlée, au minimum sur son existence.
comme tu vois ici via l'instruction :

Code : Tout sélectionner

defined('DB_NAME') ? null : define("DB_NAME", "xxxxx");
y a un contrôle. comme j'ai déja dis c'est juste un exemple l'intêret est de ne pas mettre le code entier ici mais de parler la globalité que t'as pas vu apparement comme tu le dis ici :
où est la portabilité de la chose ?
si tu veux le variable $bdd instancie la class GestionBdd(); dans le fichier bdd.php le faite de l'apellé ici

Code : Tout sélectionner

public static function count_all() { global $bdd; $sql = "SELECT COUNT(*) FROM ".self::$table_name; $result_set = $bdd->query($sql); $row = $bdd->fetch_array($result_set); return array_shift($row); }
pour voir un peu plus clair voici un autre exemple que tu peux trouver ici http://be.php.net/manual/fr/language.va ... .scope.php avec d'autre exemple à coté.

http://be.php.net/manual/fr/language.va ... .scope.php
<?php
$a = 1;
$b = 2;
function somme() {
    global $a, $b;
    $b = $a + $b;
}
somme();
echo $b;
c'est exactement ce que je fait dans la classe GestionBdd. :mrgreen:

Re: pb insertion dans une table

Posté : 30 juil. 2011, 00:43
par Cyrano

Code : Tout sélectionner

<?php // Database Constants defined('DB_SERVER') ? null : define("DB_SERVER", "localhost"); defined('DB_USER') ? null : define("DB_USER", "xxxxx"); defined('DB_PASS') ? null : define("DB_PASS", "xxxxx"); defined('DB_NAME') ? null : define("DB_NAME", "xxxxx"); ?>
:shock: Voir ce genre de code me laisse toujours perplexe et je me demande toujours « Il ne sait pas ou il nous prend pour des billes ? »

Je ne suis pas un gourou du PHP, loin s'en faut, mais tout de même... allez, le même en plus rationnel :

Code : Tout sélectionner

<?php // Database Constants defined('DB_SERVER') || define("DB_SERVER", "localhost"); defined('DB_USER') || define("DB_USER", "xxxxx"); defined('DB_PASS') || define("DB_PASS", "xxxxx"); defined('DB_NAME') || define("DB_NAME", "xxxxx"); ?>
Un des devoirs permanents du développeur consciencieux, c'est de passer un temps raisonnable sur l'actualité du langage, dans la documentation et en particulier les commentaires qui y sont postés par pas mal des types (voire des nanas, il y en a aussi, [Kiss mere-t]) qui n'ont pas grand chose à apprendre ici. Un jour on voit une structure de code pas ordinaire, on la regarde de près, on l'analyse, on en comprend la sémantique et on l'utilise ou non mais on utilise plus des archaïsmes de la programmation ou des structures qui n'ont pas une logique imparable.

Je vais profiter de cette réponse pour ajouter un commentaire beaucoup plus général dont j'invite tout un chacun à s'inspirer si le coeur lui en dit. Je ne participe plus autant qu'à l'origine sur ce forum, précisément parce que'avec le temps j'ai réalisé à quel point je n'y connaissais en fin de compte pas grand chose. Il me reste encore une partie très appréciable de la programmation à apprendre et de ce fait, il serait malhonnête de ma part de donner une réponse à une question ici sans être absolument certain de la validité de cette réponse. Or voilà, avec les années, j'ai fini par comprendre que très peu des réponses que je pourrais fournir sont réellement pertinentes et/ou valables.

Chacun ici s'attend à trouver de la qualité dans le support, il nous appartient à tous d'y mettre du nôtre pour que ça reste ainsi. Désolé abdelseo si c'est toi qui prend, mais j'ai ça sur l'estomac depuis trop longtemps. On est pas là pour faire du chiffre en croyant savoir, on est là parce qu'on aime le beau code qui donne le résultat attendu en moins de lignes de code :)

My 2¢ ;)

Re: pb insertion dans une table

Posté : 30 juil. 2011, 16:20
par abdelseo
Chacun ici s'attend à trouver de la qualité dans le support, il nous appartient à tous d'y mettre du nôtre pour que ça reste ainsi. Désolé abdelseo si c'est toi qui prend, mais j'ai ça sur l'estomac depuis trop longtemps. On est pas là pour faire du chiffre en croyant savoir, on est là parce qu'on aime le beau code qui donne le résultat attendu en moins de lignes de code :)
ta pas à être désolé j'utilise la meme version de ton code dans mes projets actuels
defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
defined('PUBLIC_PATH') || define('PUBLIC_PATH', realpath(dirname(__FILE__)));
defined('APPLICATION_PATH') || define('APPLICATION_PATH', PUBLIC_PATH . '/../application');
defined('LIBRARY_PATH') || define('LIBRARY_PATH', PUBLIC_PATH . '/../library');

setlocale(LC_ALL, 'fr_FR.UTF-8');


require_once 'Zend/Application.php';
$application = new Zend_Application(
    APPLICATION_ENV, 
    APPLICATION_PATH .'/configs/application.ini'
);

$application
	->bootstrap()
	->run();
mais encore une autre fois c'est un exemple que j'ai pris vite fait d'un ancien projet pour participer dans le but d'aider et non pas pour que t'aura mal à l'estomac malgré tout ça je vois pas ce qui est si choquant dans ce morceau de code, faut savoir aussi que chacun à sa façon de coder. encore si j'ai été moi je réagissais pas comme ça surtout face à ce morceau de code que tu viens de critiquer ici mais merci pour quand même . =D>

Re: pb insertion dans une table

Posté : 01 août 2011, 03:05
par devlop78
Ca repose aussi sur des habitudes de codage. Utiliser le || est une habitude à prendre, perso, je ne l'ai pas vraiment. Et ce n'est pas forcément le plus important. C'est comme faire un foreach au lieu d'un array_map, ça se discute ... Il y a franchement de pires habitudes ou manques à combattre que ça. Mais ça pourrait être intéressant, dans un article, de parler des normes de codages ET de raccourcis. L'opérateur terniaire, en plus de pouvoir être utilisable dans des concaténations etc, est aussi un beau raccourci. On y pense pas forcément, même si on le comprend ...

Re: pb insertion dans une table

Posté : 01 août 2011, 11:19
par zeus
Le but de l'opérateur ternaire est de retourner une valeur en fonction d'un test (voir mon tuto), pas de faire une opération en fonction d'un test.
L'utiliser de cette manière reviens à détourner son utilisation et peut apporter des effets de bords indésirables non anticipé.
C'est comme si tu ouvrais un fichier en écriture dès que tu voulais tester son existence : à la fin, tu te retrouves avec des tas de fichiers vides non désirés.
Eh bah là, tu te retrouves avec des fuites de mémoire puisque le retour de define() est retourné à la sortie de l'opérateur ternaire pour rien.

Je pense que pour réellement franchir un cap en développement, il faut arrêter le "ça marche, donc c'est bon" et essayer de comprendre à quoi correspond tel ou tel truc.