Использование объединенной строки в запросе SQL

0

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

Таким образом, у меня есть массив, который я прокручиваю и объединяю значения, чтобы создать строку.

foreach ($customer_info as $key=>$value) {
    $fieldInsert .= '''.$key.'',';
    $valueInsert .= $value.',';
}

$fieldInsert = rtrim($fieldInsert, ",");
$valueInsert = rtrim($valueInsert, ",");

Это правильно создает две строки, например:

'field1','field2','field3'
value1,value2,value3

Тогда у меня есть мой запрос:

$query = $mysqli->query("INSERT INTO 'customers' ('$fieldInsert') VALUES ('$valueInsert')");
var_dump($query);

Но это не сработает. Любая помощь?

Просто пытаюсь настроить обработку ошибок, поскольку мы говорим, работая над кем-то проектом elses.

  • 2
    ВНИМАНИЕ : При использовании mysqli вы должны использовать параметризованные запросы и bind_param для добавления пользовательских данных в ваш запрос. НЕ используйте интерполяцию строк для этого, потому что вы будете создавать серьезные ошибки SQL-инъекций . То, что вы делаете здесь, чрезвычайно опасно.
Теги:
string
string-concatenation

1 ответ

0

Я не работаю в mySql, но я хорошо знаю SQL. Проблема в том, что вы не можете использовать переменные для имен объектов в запросе, если только вы не создаете целую строку и не передаете ее команде выполнения. Я покажу вам пример в t-SQL, который является моим родным языком.

Вы заметите, что я создаю две таблицы и помещаю в них данные. У них разные имена столбцов и таблиц, но оператор SQL, который выбирает из них, использует переменные для объединения в оператор многократного использования. Как только инструкция построена, я передаю ее команде EXECUTE. Я верю, что в mySql команда EXECUTE IMMEDIATE, но я не уверен.

IF EXISTS (SELECT * from sys.tables where name = 'People')
DROP TABLE People
GO
-- First create one table with a list of people
CREATE TABLE People(
PersonId INT NOT NULL,
FirstName VARCHAR(20) NULL,
LastName VARCHAR(20) NULL
)
GO
INSERT INTO People (PersonId, FirstName, LastName) VALUES 
(1, 'George', 'Washington'),
(2, 'Thomas', 'Jefferson'),
(3, 'Teddy', 'Roosevelt'),
(4, 'Abe', 'Lincoln')
GO

IF EXISTS (SELECT * from sys.tables where name = 'RushmoreHeads')
DROP TABLE RushmoreHeads
GO

-- Then create one table with a list of the heads on Mount Rushmore
CREATE TABLE RushmoreHeads(
RushId INT NOT NULL,
Name VARCHAR(30) NULL,
PresidentNumber INT NULL
)
GO

INSERT INTO RushmoreHeads(RushId, Name, PresidentNumber ) VALUES 
(1, 'George Washington', 3),
(2, 'Thomas Jefferson', 2),
(3, 'Teddy Roosevelt', 26),
(4, 'Abe Lincoln', 16)
GO

DECLARE @SQLPrefix VARCHAR(200)
DECLARE @SQLDelimiter VARCHAR(200)
DECLARE @SQLSuffix VARCHAR(200)
DECLARE @SQLWhere VARCHAR(200)
DECLARE @Table VARCHAR(20)
DECLARE @Column1 VARCHAR(20)
DECLARE @Column2 VARCHAR(20)
DECLARE @Column3 VARCHAR(20)

DECLARE @SQL2Execute VARCHAR(2000)

SET @SQLPrefix = 'SELECT '
SET @SQLSuffix = ' FROM '
SET @SQLDelimiter = ' , '

-- Object names from first table
SET @Table = 'People'
SET @Column1 = 'PersonId'
SET @Column2 = 'FirstName'
SET @Column3 = 'LastName'

-- Construct the select statement
SET @SQL2Execute = @SQLPrefix + @Column1+ @SQLDelimiter + 
    @Column2+ @SQLDelimiter + @Column3+ @SQLSuffix + @Table
PRINT @SQL2Execute

EXECUTE (@SQL2Execute)

-- Object names from second table
SET @Table = 'RushmoreHeads'
SET @Column1 = 'RushId'
SET @Column2 = 'Name'
SET @Column3 = 'PresidentNumber'

-- Same code as first table
SET @SQL2Execute = @SQLPrefix + @Column1+ @SQLDelimiter + 
    @Column2+ @SQLDelimiter + @Column3+ @SQLSuffix + @Table

EXECUTE (@SQL2Execute)
PRINT @SQL2Execute

Ещё вопросы

Сообщество Overcoder
Наверх
Меню