2015-01-29 2 views
0

생각 나는 배열에서 내 값과 필드 이름을 연결 한 다음 SQL에 삽입하는 것이 현명했습니다. 이것은 내가 사용하는 함수에 직접 많은 양의 값을 저장하는 것을 목표로 삼았다.SQL 쿼리에서 연결된 문자열 사용

그래서 루프를 만들고 값을 연결하여 문자열을 만드는 배열이 있습니다.

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'] (http://php.net/manual/en/mysqli-stmt.bind-param. php)를 사용하여 쿼리에 사용자 데이터를 추가합니다. ** 심각한 [SQL injection bug] (http://bobby-tables.com/)를 만들므로 문자열 보간을 사용하여 **이를 수행하지 마십시오. 여기서하고있는 일은 매우 위험합니다. – tadman

답변

0

mySql에서 작동하지 않지만 SQL을 잘 알고 있습니다. 문제는 전체 문자열을 작성하여 실행 명령에 전달하지 않는 한 쿼리에서 개체 이름에 변수를 사용할 수 없다는 것입니다. 제 모국어 인 t-SQL의 예를 보여 드리겠습니다.

두 개의 테이블을 만들고 데이터를 넣었습니다. 그것들은 다른 컬럼과 테이블 이름을 가지고 있지만 그것들로부터 선택하는 SQL 문은 변수를 사용하여 재사용 가능한 문장으로 연결됩니다. 구문이 만들어지면 EXECUTE 명령에 전달합니다. 나는 mySql에서 명령이 즉시 실행되지만 확실하지 않다고 믿는다.

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