2016-08-17 5 views
0

여러 쿼리를 실행하려고하는데 뭔가 잘못되었습니다.여러 쿼리를 실행할 수 없습니다.

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0); 

$sql = " 
UPDATE tmatria SET par = " . $newpar . ", inde = " . $newinde . " WHERE id =" . $cutid . "; 
SELECT * FROM tmatria ORDER BY inde ASC; 
SET @i := 0; 
UPDATE tmatria SET inde = @i := @i + 1; 
"; 

try { 
    $db->exec($sql); 
} 
catch (PDOException $e) { 
    echo $e->getMessage(); 
    die(); 
} 

나는 그때 라인 UPDATE tmatria SET par...SELECT * FROM tmatria ORDER BY inde ASC; 중요하다 생각 inde 열을 기준으로 테이블을 정렬하고 마지막으로 1 2 3...

inde 값을 설정, 일부 열을 업데이트하고 싶지만, 무엇이 잘못되었는지 볼 수 없습니다.

어떤 도움이 필요합니까?

+2

그건 절대적으로 *** 아닙니다 *** 쿼리에 변수를 포함시키는 방법입니다. – Ben

+0

실행하려고하면 어떻게됩니까? 특정 오류 메시지가 나타 납니까? –

+0

@RobertColumbia 오류 메시지가 없습니다. – bonaca

답변

1

SQL 사용법에 대한 근본적인 오해가 있습니다. SELECT ... ORDER BY를 수행하면 다음 UPDATE가 동일한 순서를 따르기를 기대합니다. UPDATE는 자연 순서대로 테이블을 정렬하고 SELECT 쿼리에 전혀 신경을 쓰지 않습니다.

코딩의 문제로, 한 번의 호출로 여러 SQL 문을 실행할 필요가 없습니다. PDO는 그것을 허용하지만 좋은 습관은 아닙니다. 호출 당 하나의 SQL 문을 실행해야합니다. 동일한 db 연결을 사용하는 한 세션 변수 @i은 그 값을 유지합니다.

PHP 변수를 SQL 문과 결합하려면 준비된 쿼리를 사용하십시오. PHP 변수를 SQL 문자열에 연결하지 마십시오.

try { 
    $sql = "UPDATE tmatria SET par = ?, inde = ? WHERE id = ?"; 
    $stmt = $db->prepare($sql); 
    $stmt->execute([$newpar, $newinde, $cutid]); 
    $sql = "SET @i := 0"; 
    $db->exec($sql); 
    $sql = "UPDATE tmatria SET inde = @i := @i + 1 ORDER BY inde ASC"; 
    $db->exec($sql); 
} 
catch (PDOException $e) { 
    echo $e->getMessage(); 
    die(); 
} 

그것은 또한 당신이 연속적인 값을 가지고 해당 열을 강제로 모든 업데이트 후 inde 번호를 다시하려는 것 같습니다. 이렇게하면 테이블에있는 행 수가 많을수록 속도가 느려지고 느려집니다. 맞습니까?

왜 그 열을 연속적인 값으로 사용해야하는지 다시 생각해보아야합니다.

+0

고마워요. 나는 요점을 지금 본다. 해결 (희망). – bonaca

1

한 번에 하나씩 PDO에 쿼리를 전달해야합니다. PDO가 쿼리를 순서대로 실행하기 때문에 여전히 @i과 같은 변수를 사용할 수 있습니다. 그러나 한 번의 호출로 쿼리 혼란을 겪지는 않습니다.

+0

나는 이해가되지 않을까 걱정됩니다. 예를 들어 주시겠습니까? – bonaca

관련 문제