pg_query INSERT INTO не работает

У меня есть установка с Apache24, средой php и базой данных postgresql. Я пытаюсь заполнить некоторые столбцы (не все) в таблице db значениями, но это не работает так, как я ожидал.

Я получаю следующую ошибку / предупреждение, и база данных не заполнена: Предупреждение: pg_query (): Запрос не выполнен: ОШИБКА: синтаксическая ошибка на уровне или рядом с "c329a92850f6d539dd376f4816ee2764517da5e0235514af433164480d7a" СТРОКА 1: ... word, saltEF jAjULT. (C нет, пер, 8254c329a92850 ... ^ в C: \ Users \ Public \ Server \ Apache24 \ htdocs \ eMe \ newuser.php в строке 34

Любая поддержка по этому поводу приветствуется. Я искал похожие вопросы, но не смог интерпретировать ответы в своем контексте.

<?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);
?>

Я попытался включить кавычки и обратные кавычки, как описано в этом ссылка, но это не решает проблему. Однако ошибка / предупреждение немного отличается:

Предупреждение: pg_query (): сбой запроса: ОШИБКА: синтаксическая ошибка около или около "` "СТРОКА 1: ВСТАВИТЬ INTO пользователей (userid,` mailaddress`, `username`,` use ... ^ в C: \ Users \ Public \ Сервер \ Apache24 \ htdocs \ eMe \ newuser.php в строке 30


person om78    schedule 20.10.2017    source источник
comment
Я бы очень рекомендовал перейти на PDO, который может взаимодействовать с pgsql. С подготовленными операторами и привязкой параметров вам никогда не придется беспокоиться о проблемах с цитированием, и вам не нужно будет экранировать свои значения.   -  person aynber    schedule 20.10.2017
comment
Спасибо за совет. Я посмотрю, удастся ли мне использовать PDO. Мне немного сложно понять синтаксис / настройку   -  person om78    schedule 20.10.2017


Ответы (1)


Единственная проблема в вашем коде заключается в том, что вы еще не поняли, что при написании этого:

$username = pg_escape_string($username);

$username экранируется для инъекции, что хорошо, но при этом добавляются необходимые кавычки внутри значения, а не вокруг значения (см. Что именно делает pg_escape_string? подробнее).

Таким образом, в запросе необходимы кавычки вокруг буквальных текстовых значений в дополнение к экранированию содержимого, как показано ниже:

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

(учитывая, что переменные в этом запросе уже были переданы через pg_escape_string)

person Daniel Vérité    schedule 21.10.2017
comment
Привет, спасибо за вашу помощь и извините за поздний ответ. Однако я переключился на использование PDO API вместо этого, следуя некоторым примерам, и заставил его работать именно так. - person om78; 09.02.2018