Bonjour,

J'ai un petit souci! Je suis débutant et j'apprend PHP/MySQL depuis 2 jours en regardant le plus de tutoriels possible.
mais ce problème, je vois pas comment faire. J'arrive a faire appraitre l'information de la table client en test via echo mais quand je clique inscription ca me dit user_id cannot be null

J'ai deux table - une clients et l'autre annnonces

client annonces id annonce_id prenom annonce_titre nom annonce_description email user_id password

Dans ma page ajouter annonce, je veux ajouter le (id) du client dans le (user_id) de la table annonce quand il fait son inscription
j'y arrive pas :(

Voici le code (dsl pour le code Dreamweaver)

<?php require_once('Connections/ma_db.php'); ?>
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
if (PHP_VERSION < 6) {
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
}

$theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}
}

$editFormAction = $_SERVER'PHP_SELF'];
if (isset($_SERVER'QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER'QUERY_STRING']);
}

if ((isset($_POST"MM_insert"])) && ($_POST"MM_insert"] == "annonce")) {
$insertSQL = sprintf("INSERT INTO annonces (annonce_id, user_id, annonce_titre, annonce_description) VALUES (%s, %s, %s, %s)",
GetSQLValueString($_POST'annonce_id'], "int"),
GetSQLValueString($_POST'user_id'], "int"),
GetSQLValueString($_POST'annonce_titre'], "text"),
GetSQLValueString($_POST'annonce_description'], "text"));

mysql_select_db($database_ma_db, $ma_db);
$Result1 = mysql_query($insertSQL, $ma_db) or die(mysql_error());

$insertGoTo = "ok";
if (isset($_SERVER'QUERY_STRING'])) {
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER'QUERY_STRING'];
}
header(sprintf("Location: %s", $insertGoTo));
}

mysql_select_db($database_ma_db, $ma_db);
$query_rsClient = "SELECT clients.id, clients.prenom, clients.nom, clients.email FROM clients";
$rsClient = mysql_query($query_rsClient, $ma_db) or die(mysql_error());
$row_rsClient = mysql_fetch_assoc($rsClient);
$totalRows_rsClient = mysql_num_rows($rsClient);

mysql_select_db($database_ma_db, $ma_db);
$query_rsannonce = "SELECT * FROM annonces";
$rsannonce = mysql_query($query_rsannonce, $ma_db) or die(mysql_error());
$row_rsannonce = mysql_fetch_assoc($rsannonce);
$totalRows_rsannonce = mysql_num_rows($rsannonce);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ajouter annonce</title>
</head>

<body>
test echo le id: <?php echo $row_rsClient'id']; ?> le prenom <?php echo $row_rsClient'prenom']; ?> nom de famille <?php echo $row_rsClient'nom']; ?> email <?php echo $row_rsClient'email']; ?>

<form id="annonce" name="annonce" method="POST" action="<?php echo $editFormAction; ?>">
<table width="653" cellspacing="0" cellpadding="0">
<tr>
<td width="183">Titre</td>
<td width="692"><input type="text" name="annonce_titre" id="titre" /></td>
</tr>
<tr>
<td>Description</td>
<td><textarea name="annonce_description" id="annonce_description" cols="45" rows="5"></textarea></td>
</tr>
<tr>
<td><input name="user_id" type="hidden" /><input type="hidden" name="id" /><input type="hidden" name="annonce_id" /></td>
<td><input type="submit" name="submit" id="submit" value="Inscription" /></td>
</tr>
</table>
<input type="hidden" name="MM_insert" value="annonce" />
</form>
</body>
</html>
<?php
mysql_free_result($rsClient);

mysql_free_result($rsannonce);
?>

10 réponses


Yop,

Utilises les balises code, ca sera plus clair pour t'aider.
Et j'ai pas compris le schema de tes tables, quels champs appartient à quelle table?

Si tu veux récupérer le dernier id inséré en bdd, penses alors à la fonction mysql_insert_id();

J'ai pas compris le problème, donc c'est ptete pas du tout ça ^^

Coconut
Auteur

lol oui tu as raison, dsl je prend Dreamweaver qui me place ce code. Je suis trop débutant pour coder moi-même mais ca va venir a force de regarder les tutoriels

J'essais un JOIN SELECT * FROM clients JOIN annonces ORDER BY annonce_id et je reussi a voir mes deux table sans probleme.
Mais c'est comment inserer le ID de ma table (client) dans la colonne user_id de ma table (annonce)????

Les deux table sont : clients et annonces
faut j'arrive a inserer le id du client au champ user_id de la table annonce.

Tu fais alors ce que j'ai dit ;)
En gros ça donne :

mysql_query('INSERT INTO client(`prenom`,`nom`,`email`,`password`) VALUES(blablabla,blablabla,blablabla,blablabla)';
$id_client = mysql_insert_id();
mysql_query('INSERT INTO annonce(`annonce_id`, `user_id`, `annonce_titre`, `annonce_description`) VALUES (blablabla,'.$id_client.', blablabla, blablabla, blablabla)');

Inutile de faire des jointures ;)
Je sais même pas si c'est possible d'ailleurs ^^

Ah et au fait, faut que le champs id de la table client soit en index primaire il me semble ^^, mais bon ca devrait l'être comme tous les id ^^

Coconut
Auteur

Aaaaaaa super, je comprend maintenant grâce a ton bout de code. C'est claire.. J'essais cela..
Merci tu est bien gentil :) Bonne journée!

Coconut
Auteur

aaaaaah j'en ai mal à la tête! Pas moyen de faire passer mon id dans mon user_id de ma table annonce :(

mais juste une question comme ca
Dans ma page annonce.php, je me suis fait une session pour retracer le id .
Je reussi a le retracer en fesant des echo...

Je poste rien dans ma table client, alors, j'ai pas vraiment besoin de faire un isert sur ma table client? Un query SELECT * FROM client c'est bon quand même?
j'ai esseyé:
$id_client = mysql_insert_id();
mysql_query('INSERT INTO annonce(annonce\_id, user\_id, annonce\_titre, annonce\_description) VALUES (annonce_id,'.$id_client.', annonce_titre, annonce_description)');

Je suis perdu...

Le mysql_insert_id() doit se mettre juste après une requête de type insert into dans une table comprenant un champ primaire.
Elle récupère ainsi le dernier id enregistré dans la table, ce qui est pratique pour faire la liaison.

Si tu n'as rien à insérer dans ta table client (rien de rien de rien? même pas l'id lui même?), alors tu fais un select selon tes besoins, et t'oublies le mysql_insert_id()

Mais tu pourrais être plus explicite sur ce que tu veux faire, car c'est très illogique.
J'pensais que tu voulais ajouter une annonce, et donc un client au passage. Le client serait relier à l'annonce. C'est ça non?

L'astuce que je t'ai filé s'utilise fréquemment lors de la création de topic, car en faite un topic, c'est un topic + un post, donc forcement faut faire la liaison.
En espérant t'avoir éclairé ^^

Coconut
Auteur

Rapidement le projet c'est un système de petite annonce. La personne s'enregistre, se log et arrive dans une section membre ou il peut modifier ses informations, changer son mot de passe, etc.
Aucun problème de ce coter! Il y a aussi une page ou il pourra ajouter une petite annonce. C'est là mon problème!

Dans ma table membre, j'ai : id, prenom, nom, adresse, etc., etc.
Dans ma table annonce j'ai : annonce_id, titre, description, photo, prix, membre_id

Dans ma page ajouter_annonce.php je dois aller chercher le id de la table membre et l'insérer le id unique du client la zone membre_id de ma table annonce.

J'ai fait une session MM_Username ou je peux faire afficher certaines informations sur lui comme son nom, son téléphone, via un echo <?php echo $row_rsMembre'prenom']; ?>
les informations s'affichent et ca va bien... j'ai aussi fait un query SELECT * FROM membres WHERE blabla
Le probleme viens de mon INSERT je crois. j'ai un formulaire bien simple et j'ai mis une zone hiden pour annonce_id

J'ai passé 4 heures hier à chercher Google, il n’y a presque pas d'information disponible ou je suis aveugle :(

Coconut
Auteur

J'ai suivi le tutorial Workbench qui est très bon en passant :)

CREATE TABLE IF NOT EXISTS vision\_db.membres (
id INT NOT NULL AUTO_INCREMENT ,
level ENUM('particulier','concessionnaires','vip') NOT NULL ,
prenom VARCHAR(25) NOT NULL ,
nom VARCHAR(25) NOT NULL ,
adresse VARCHAR(45) NULL ,
ville VARCHAR(25) NULL ,
province VARCHAR(25) NULL DEFAULT 'Québec' ,
code\_postale VARCHAR(10) NULL ,
telephone VARCHAR(15) NULL ,
cell VARCHAR(15) NULL ,
email VARCHAR(45) NOT NULL ,
password VARCHAR(40) NOT NULL ,
site\_web VARCHAR(25) NULL ,
derniere\_connexion DATETIME NULL ,
date\_inscription DATETIME NULL ,
activation ENUM('0','1') NULL DEFAULT 0 ,
PRIMARY KEY (id) )
ENGINE = InnoDB;

CREATE UNIQUE INDEX email\_UNIQUE ON vision\_db.membres (email ASC) ;

CREATE TABLE IF NOT EXISTS vision\_db.annonces (
id INT NOT NULL AUTO_INCREMENT ,
titre VARCHAR(20) NULL ,
description LONGTEXT NULL ,
membres\_id INT NOT NULL ,
prix VARCHAR(45) NULL ,
PRIMARY KEY (id) ,
CONSTRAINT membred\_id
FOREIGN KEY (membres\_id )
REFERENCES vision\_db.membres (id )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;

CREATE INDEX membred\_id ON vision\_db.annonces (membres\_id ASC) ;

Le plus simple est de stocker les information des membres dans un tableau comme ceci:

$sql = mysql_query('SELECT * FROM membres WHERE pseudo="'.Membre'prenom'].'"');
$membre = mysql_fetch_assoc($sql);

Puis plus tard dans le code, pour inserer tu fais ainsi :

INSERT INTO annonce(`annonce_id`, `user_id`, `annonce_titre`, `annonce_description`) VALUES (blablabla,'.$membre'id'].', blablabla, blablabla, blablabla)
Coconut
Auteur

Bon, j'avance un peu mais je réussi pas à insirer le membre_id

J'ai fait comme tu m'a dit:
ce bout fonctionne sans soucis. Je réussi à faire afficher les info par des echos alors je sais que ca fonctionne.
<?php
mysql_select_db($database_connexion, $connexion);
$query_rsMembre = sprintf("SELECT * FROM membre WHERE username='".$_SESSION'MM_Username']."'")or die(mysql_error());
$rsMembre = mysql_query($query_rsMembre, $connexion) or die(mysql_error());
$row_rsMembre = mysql_fetch_assoc($rsMembre);
$totalRows_rsMembre = mysql_num_rows($rsMembre);
?>

C'est ici que j'ai des problème, j'ai esseyé

if ((isset($_POST"MM_insert"])) && ($_POST"MM_insert"] == "form2")) {
$insertSQL = sprintf("INSERT INTO annonce (titre, description, prix, membre_id) VALUES (%s, %s, %s, %s)",
GetSQLValueString($_POST'titre'], "text"),
GetSQLValueString($_POST'description'], "text"),
GetSQLValueString($_POST'prix'], "text"),
GetSQLValueString($_POST'membre_id'], "int"));

mysql_select_db($database_connexion, $connexion);
$Result1 = mysql_query($insertSQL, $connexion) or die(mysql_error());

$insertGoTo = "ok.php";
if (isset($_SERVER'QUERY_STRING'])) {
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER'QUERY_STRING'];
}
header(sprintf("Location: %s", $insertGoTo));
}
?>
Je pense c'est les %s de Dreamweaver qui me bloque, j'ai esseyé d'ajouter '.$membre_id'id'].' qui me donne un erreur
et si j'efface les GetSQLValueString plus rien fontionne.

J'ai toujours le message membre_id can't not be null

Je n'ai pas besoin d'ajouter un hidden dans ma form vu que je fait un session username?