2017-08-14 12 views
0

J'essaie de construire un petit système de messagerie privé en PHP, j'utilise PDO comme connexion à la base de données. J'ai le plus à travailler, sauf la partie la plus importante.INSERT système de messagerie privé PDO php

Je ne peux pas obtenir le message d'insertion pour écrire quoi que ce soit à la base de données, donc j'adorerais de l'aide.

Je publierai d'abord ma base de données pour que vous puissiez tous voir avec quoi nous travaillons ici. commençant par mes utilisateurs

id int(10) UN AI PK 
username varchar(30) 
password varchar(100) 
regdate datetime 

C'est ma table de message qui im ​​essayant d'écrire le message à

id int(11) AI PK 
from_user varchar(45) 
to_user varchar(45) 
subject varchar(400) 
message text 
date date 
read tinyint(4) 

J'ai essayé quelques Code diffrent pour l'obtenir pour travailler je vais maintenant coller le code qui selon mon contrôle d'erreur indique que le message a été envoyé avec succès ...

$sql = " 
INSERT INTO private_messages VALUES('',$user, 
$to_user','$subject',$message','$date','0') 
"; 

    echo "Youre message was succesfully sent..."; 

Mais cela ne fonctionne pas et je sais que Ce n'est probablement pas la bonne façon d'utiliser PDO.

J'ai aussi essayé

$query =$dbh->prepare("INSERT INTO private_messages(user, to_user, subject, 
message, 
date); 
VALUES('',$user, $to_user','$subject',$message','$date','0') 
"); 

$query->bindParam(":user", $user); 
$query->bindParam(":to_user", $to_user); 
$query->bindParam(":subject", $subject); 
$query->bindParam(":message", $message); 

if ($query->execute()) { 
    $success = true; 
} 

mais j'obtenir Fatal error: Uncaught PDOException: SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1064

Je signalerai également la forme im utilisant si cela peut être une valeur

echo " 
<form action='compose.inc.php' method='POST'> 
<table> 
<tr> 
<td>To: </td> 
<td><input type='text' name='to_user'/></td> 
</tr> 
<tr> 
<td>Subject: </td> 
<td><input type='text' name='subject'/></td> 
</tr> 
<tr> 
<td>Message:</td> 
<td><textarea name='message' rows='10' cols='50'></textarea></td> 
</tr> 
<tr> 
<td></td> 
<td colspan='2'><input type='submit' name='submit' value='Send Message'/> 
</td> 
</r> 
</table> 
</form> 

    "; 

Lors de cette opération système de messagerie ive suite à cette https://www.youtube.com/watch?v=BED_yMC7qv0, son utilisation de mysqli et moi avons essayé de décoder à PDO, je pense que le problème réside là

Donc récapitulatif court Mon message d'erreur indique que mes messages sont envoyés. Rien n'est écrit dans ma base de données. im essayant d'utiliser PDO.

Si un je ne peux pas trouver une solution j'aimerais obtenir des pointeurs vers des tutoriels ou des livres ou tout ce qui concerne le système de message avec PDO. Cordialement/Robert

+1

Vous devriez [lire le manuel sur les instructions préparées.] (Http://php.net/manual/fr/pdo.prepared-statements.php). Lorsque vous liez des variables, vous devez ajouter des espaces réservés au lieu de concaténer les valeurs dans la requête. –

+0

Vous avez également une citation unique inégalée: ', to_user de $ », ' –

+0

J'ai enlevé cette citation, na pas Helpt j'ai aussi utilisé $ sql =" \t INSERT INTO private_messages (utilisateur,) et \t VALEURS (: l'utilisateur, $ stmt = $ dbh-> prepare ($ sql); $ stmt-> bindValue (": utilisateur", $ _POST ["utilisateur"]); if ($ stmt-> execute()) { \t \t $ Success = true; \t \t} <- une version courte mais de cette manière avec toutes les valeurs ofc – Robert

Répondre

1

Au lieu d'insérer les variables dans la requête, vous le faites en les liant.

$query =$dbh->prepare("INSERT INTO private_messages (user,to_user,subject,message,date) 
VALUES(:user,:to_user,:subject,:message,NOW())"); 

$query->bindParam(":user", $user); 
$query->bindParam(":to_user", $to_user); 
$query->bindParam(":subject", $subject); 
$query->bindParam(":message", $message); 

if ($query->execute()) { 
    $success = true; 
} 

Vous devez également faire correspondre la quantité de valeurs à la quantité de colonnes.

+0

J'ai essayé quelque chose simillar. s est cette erreur fatale: PDOException Uncaught: SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1064 Vous avez une erreur dans votre SQLuse près de '; VALUES (?,?,?,?,?) 'À la ligne 1 sur 37): PDO-> prepare (' INSERT INTO pri ... ') # 1 Mais im utilise à peu près la même chose pour enregistrer un utilisateur, et que fonctionne bien. – Robert

+0

que voulez-vous dire par «ceci»? –

+0

Ah désolé je vois l'erreur maintenant :-) vous devriez supprimer le ';' après 'date)' Je vais changer cela dans ma réponse. –