Php форма для добавления контента в колонку без перезаписи - PullRequest
0 голосов
/ 25 октября 2018

Мне нужна форма для добавления данных в столбец без перезаписи старых данных, я пробовал варианты, которые не работали.В идеале я хочу, чтобы в качестве проставки между старым и новым использовались 3 дефиса, поэтому, если кто-то ввел XXX и уже был YYY, он будет сохранен как YYY --- XXX, а затем, если кто-то введет XXX, и он будет нулевым, тообновлено без дефисов, но я еще не решил бит добавления текста.

Оператор

<?php

$v = array();
$v[0] = $_POST['note'];
$v[1] = $_POST['product_id'];

$dbh = dbh_get();

$sql = 'UPDATE card SET notes = $v[0] + notes WHERE product=$v[1]';
$stmt = $dbh->prepare($sql);
$stmt->execute($v);

dbh_free($dbh) ?>`

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Как уже сказал @a_horse_with_no_name, вам нужно использовать оператор конкатенации строк или, как я бы предпочел, использовать concat_ws, поскольку + для числовых операций.

Но есть двабольше выдает в вашем примере.Прежде всего, вы используете переменную для помещения строки в SQL-запрос.В целом это будет работать, но вам нужно поместить переменные в кавычки ', чтобы получить корректную строку sql.Например:

$sql = "UPDATE card SET notes = concat_ws('---', '{$v[0]}', notes) WHERE product = '{$v[1]}'";

Это позволит вам создать правильно отформатированный SQL-оператор.Но это все равно плохо, потому что, как я упоминал в комментариях, вы никогда не должны напрямую помещать введенный пользователем контент в запрос к базе данных.Даже если он используется только для внутренних целей.Это был бы не первый случай, когда недружелюбный сотрудник хотел бы нанести вред внутренним данным.

Но даже если это не предназначено, это может нарушить ваш сценарий.Если значение $v[0] или $v[1] содержит одну кавычку ', SQL-запрос станет недействительным.Поэтому, пожалуйста, избегайте значений, прежде чем помещать их в запрос.Для postgres вы можете использовать pg_escape_string в php.Или, может быть, у вашего класса есть собственная функция для этого.Но вот как это выглядит:

$note = pg_escape_string($_POST['note']);
$product = pg_escape_string($_POST['product_id']);
$sql = "UPDATE card SET notes = concat_ws('---', '{$note}', notes) WHERE product = '{$product}'";
0 голосов
/ 25 октября 2018

Оператор конкатенации строк в SQL равен ||.+ - это добавление чисел:

update card
   set notes = $v[0] || notes
where ...

Обратите внимание, что a || b дает null, если любое из выражений равно нулю.Если notes может быть нулевым в таблице, используйте функцию null-safe concat():

update card
   set notes = concat($v[0], notes)
where ...

Чтобы добавить «пробел», вы можете использовать concat_ws(), который будет автоматически обрабатывать нули или пустыестроки:

update card
   set notes = concat_ws('---', $v[0], notes)
where ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...