PHP/MySQL에서 하나의 MySQL 쿼리를 하나로 실행하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/802437

  •  03-07-2019
  •  | 
  •  

문제

다음과 같이 두 가지 쿼리가 있습니다.

SELECT SQL_CALC_FOUND_ROWS Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;
SELECT FOUND_ROWS();

한 번의 시도 로이 두 쿼리를 실행하고 싶습니다.

$result = mysql_query($query);

그러나 각 테이블을 따로 세트하는 방법을 알려주세요. 실제로 ASP.NET에서 우리는 두 개의 쿼리를 다음과 같이 처리하는 데이터 세트를 사용합니다.

ds.Tables[0];
ds.Tables[1]; .. etc

php/mysql을 사용하여 어떻게 동일하게 할 수 있습니까?

도움이 되었습니까?

해결책

업데이트: 깃발을 전달함으로써 가능합니다 mysql_connect(). 보다 PHP로 한 명령문에서 여러 SQL 쿼리를 실행합니다 그럼에도 불구하고 현재의 독자는 사용을 피해야합니다 mysql_-함수 클래스 및 pdo를 선호합니다.

PHP에서 일반 MySQL-API를 사용하여 그렇게 할 수 없습니다. 두 쿼리 만 실행하십시오. 두 번째는 너무 빠르기 때문에 중요하지 않을 것입니다. 이것은 마이크로 최적화의 전형적인 예입니다. 그것에 대해 걱정하지 마십시오.

레코드의 경우 MySQLI와 mysqli_multi_query-기능.

다른 팁

다른 사람들이 대답했듯이 MySQLI API는 MSYQLI_MULTI_QUERY () 함수로 다중 쿼리를 실행할 수 있습니다.

가치가있는 것에 대해 PDO는 기본적으로 멀티 쿼리를 지원하며 여러 쿼리의 여러 결과 세트를 반복 할 수 있습니다.

$stmt = $dbh->prepare("
    select sql_calc_found_rows * from foo limit 1 ; 
    select found_rows()");
$stmt->execute();
do {
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
} while ($stmt->nextRowset());

그러나 멀티 쿼리는 매우 널리 알려져 있습니다 나쁜 생각 보안상의 이유로. 쿼리 문자열을 구성하는 방법에주의를 기울이지 않으면 실제로 정확한 유형의 SQL 주입 취약점을 얻을 수 있습니다. 클래식 "리틀 바비 테이블"XKCD 만화. 단일 쿼리로 제한하는 API를 사용하는 경우 발생할 수 없습니다.

사용 SQL_CALC_FOUND_ROWS 당신은 할 수 없습니다.

Found_rows ()를 통해 사용 가능한 행 카운트는 과도적이며 SELECT SQL_CALC_FOUND_ROWS 문에 따라 문을 지나서 사용할 수 있도록 의도되지 않습니다.

누군가가 당신의 이전 질문에서 언급했듯이, 사용 SQL_CALC_FOUND_ROWS 단지 카운트를 얻는 것보다 종종 느립니다.

아마도 당신은 하위 퀘스트처럼 이것을하는 것이 가장 좋을 것입니다.

SELECT 
 (select count(*) from my_table WHERE Name LIKE '%prashant%') 
as total_rows,
Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;

쿼리를 두 번 실행하지 않으려면 MySQLI 확장을 사용해야합니다.

if (mysqli_multi_query($link, $query))
{
    $result1 = mysqli_store_result($link);
    $result2 = null;

    if (mysqli_more_results($link))
    {
        mysqli_next_result($link);
        $result2 = mysqli_store_result($link);
    }

    // do something with both result sets.

    if ($result1)
        mysqli_free_result($result1);

    if ($result2)
        mysqli_free_result($result2);
}

당신은 mysqli를 사용해야합니다. 아래 코드는 잘 작동합니다.

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query  = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";

/* execute multi query */
if ($mysqli->multi_query($query)) {
    do {
        /* store first result set */
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_row()) {
                printf("%s\n", $row[0]);
            }
            $result->free();
        }
        /* print divider */
        if ($mysqli->more_results()) {
            printf("-----------------\n");
        }
    } while ($mysqli->next_result());
}

/* close connection */
$mysqli->close();
?>

이와 같이:

$result1 = mysql_query($query1);
$result2 = mysql_query($query2);

// do something with the 2 result sets...

if ($result1)
    mysql_free_result($result1);

if ($result2)
    mysql_free_result($result2);

그것은 PHP 사이트에서 그것을 말합니다 여러 쿼리가 허용되지 않습니다 (편집 : 이것은 MySQL 확장에만 해당됩니다. MySQLI 및 PDO는 여러 쿼리를 허용합니다). 따라서 PHP에서는 할 수 없지만 왜 Jon의 예와 같이 다른 MySQL_Query 호출에서 해당 쿼리를 실행할 수 없습니까? 동일한 연결을 사용하는 경우 여전히 올바른 결과를 제공해야합니다. 또한, mysql_num_rows 도울 수 있습니다.

가능합니다 MySQLI 확장을 사용하지 않고.

간단히 사용하십시오 CLIENT_MULTI_STATEMENTS 안에 mysql_connect5 번째 논쟁.

아래 주석을 참조하십시오 Husni의 게시물 자세한 내용은.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top