2017-10-20 20 views
0

J'ai une configuration avec Apache24, l'environnement php et la base de données postgresql. J'essaie de remplir certaines colonnes (pas toutes) dans la table db avec des valeurs, mais cela ne fonctionne pas comme je le pensais.pg_query INSERT INTO ne fonctionne pas

je reçois l'erreur suivante/avertissement et db est pas remplie: Warning: pg_query(): Query failed: ERREUR: erreur de syntaxe à ou près de "c329a92850f6d539dd376f4816ee2764517da5e0235514af433164480d7a" LINE 1: ... mot, sel) VALUES (DEFAULT , [email protected], per, 8254c329a92850 ...^dans C: \ Utilisateurs \ Public \ Server \ Apache24 \ htdocs \ eMe \ newuser.php sur la ligne 34

Tout support sur ce point est très apprécié. recherché pour des questions similaires, mais pas été en mesure d'interpréter les réponses dans mon contexte.

<?php 
# Registration form input to postgresql user table in myDB 
session_start(); 

# Retrieve data from input form 
$username = $_POST['username']; 
$email = $_POST['email']; 
$password = $_POST['password']; 

# Concatenate and hash password with salt 
require_once(dirname(__DIR__).'\eMe\saltgenerator.php'); 
global $randString; 
#$randString = pg_escape_string($randString); 
$isalt = pg_escape_string($randString); 

$saltandpassword = $isalt. $password; 
$hashedpassword = hash('sha256', $saltandpassword, false); 

$username = pg_escape_string($username); 
$email = pg_escape_string($email); 
$hashedpassword= pg_escape_string($hashedpassword); 

# Insert data into Postgresql database 
# INSERT INTO table_name (column1, column2, column3 .....) VALUES (value1, value2, value3....) 
include_once(dirname(__DIR__).'\eMe\config.php'); 
$query = "INSERT INTO users (userid, mailaddress, username, userpassword, salt) VALUES (DEFAULT, $email, $username, $hashedpassword, $isalt)"; 
#$result = 
#pg_query_params($query); 
pg_query($query); 
?> 

J'ai essayé d'inclure des citations et backtick quotes comme décrit sur ce link mais cela ne résout pas le problème. L'erreur/avertissement est légèrement différent si:

Warning: pg_query(): Query failed: ERREUR: erreur de syntaxe à ou près "`" LINE 1: INSERT INTO utilisateurs (userid,` mailaddress`, `username`,` utilisez ...^dans C: \ Utilisateurs \ Public \ Serveur \ Apache24 \ htdocs \ eMe \ newuser.php sur la ligne 30

+1

Possible duplicate of [Quand utiliser des guillemets simples, des guillemets doubles et des guillemets dans MySQL] (https://stackoverflow.com/questions/11321491/when-to-use-single-quotes-double-quotes -and-backticks-in-mysql) – aynber

+0

Je recommande vraiment de passer à PDO, qui peut interagir avec pgsql . Avec les instructions préparées et la liaison des paramètres, vous n'aurez plus jamais à vous soucier des problèmes de citation, et vous n'aurez pas besoin d'échapper à vos valeurs. – aynber

+0

Merci pour le conseil. Je vois si je parviens à utiliser PDO. Je trouve un peu difficile de comprendre la syntaxe/configuration – om78

Répondre

0

Le seul problème dans votre code est que vous n'avez pas encore compris que lorsque vous écrivez:

$username = pg_escape_string($username); 

$username se sont échappés pour l'injection obtient, ce qui est bon, mais cela ajoutera les devis nécessaires à l'intérieur la valeur, pas autour de la valeur (voir Whats does pg_escape_string exactly do? pour plus).

Ainsi, dans la requête, les guillemets sont nécessaires autour des valeurs du texte littéral en plus pour échapper au contenu, comme dans les domaines suivants:

$query = "INSERT INTO users (userid, mailaddress, username, userpassword, salt) 
      VALUES (DEFAULT, '$email', '$username', '$hashedpassword', '$isalt')"; 

(données qui ont déjà été passé avec succès les variables dans cette requête par pg_escape_string)

+0

Salut merci pour votre aide, et désolé pour la réponse tardive. Cependant, je suis passé à l'utilisation de l'API PDO à la place en suivant quelques exemples et en le faisant fonctionner de cette façon. – om78