MySQLi 명령문 실행

명령문은 mysqli::query(), mysqli::real_query()mysqli::multi_query()로 실행할 수 있습니다. mysqli::query() 함수는 가장 일반적이며 한 번의 호출로 실행 문을 결과 집합의 버퍼링된 페치(있는 경우)와 결합합니다. mysqli::query()를 호출하는 것은 mysqli::real_query() 다음에 mysqli::store_result()를 호출하는 것과 동일합니다.

예제 #1 쿼리 실행

                  
<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
                  
                

버퍼링된 결과 집합

명령문 실행 후 결과를 한 번에 모두 검색하거나 서버에서 행별로 읽을 수 있습니다. 클라이언트 측 결과 집합 버퍼링을 사용하면 서버가 명령문의 결과와 관련된 리소스를 최대한 빨리 해제할 수 있습니다. 일반적으로 클라이언트는 결과 집합을 느리게 소비합니다. 따라서 버퍼링된 결과 집합을 사용하는 것이 좋습니다. mysqli::query()는 명령문 실행과 결과 집합 버퍼링을 결합합니다.

PHP 애플리케이션은 버퍼링된 결과를 자유롭게 탐색할 수 있습니다. 결과 집합이 클라이언트 메모리에 유지되기 때문에 탐색이 빠릅니다. 서버를 확장하는 것보다 클라이언트별로 확장하는 것이 더 쉬운 경우가 많습니다.

예제 #2 버퍼링된 결과 탐색

                  
<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)");

$result = $mysqli->query("SELECT id FROM test ORDER BY id ASC");

echo "Reverse order...\n";
for ($row_no = $result->num_rows - 1; $row_no >= 0; $row_no--) {
    $result->data_seek($row_no);
    $row = $result->fetch_assoc();
    echo " id = " . $row['id'] . "\n";
}

echo "Result set order...\n";
foreach ($result as $row) {
    echo " id = " . $row['id'] . "\n";
}
                  
                

위의 예는 다음을 출력합니다.

Reverse order...
 id = 3
 id = 2
 id = 1
Result set order...
 id = 1
 id = 2
 id = 3
                

버퍼링되지 않은 결과 집합

클라이언트 메모리가 짧은 리소스이고 서버 부하를 낮게 유지하기 위해 가능한 한 빨리 서버 리소스를 해제할 필요가 없는 경우 버퍼되지 않은 결과를 사용할 수 있습니다. 모든 행을 읽기 전에는 버퍼링되지 않은 결과를 스크롤할 수 없습니다.

예제 #3 버퍼링되지 않은 결과 탐색

                  
<?php

$mysqli->real_query("SELECT id FROM test ORDER BY id ASC");
$result = $mysqli->use_result();

echo "Result set order...\n";
foreach ($result as $row) {
    echo " id = " . $row['id'] . "\n";
}
                  
                

결과 집합 값 데이터 유형

mysqli::query(), mysqli::real_query()mysqli::multi_query() 함수는 준비되지 않은 명령문을 실행하는 데 사용됩니다. MySQL 클라이언트 서버 프로토콜 수준에서 명령문 실행에는 COM_QUERY 명령과 텍스트 프로토콜이 사용됩니다. 텍스트 프로토콜을 사용하면 MySQL 서버는 결과 집합의 모든 데이터를 보내기 전에 문자열로 변환합니다. 이 변환은 SQL 결과 집합 열 데이터 형식에 관계없이 수행됩니다. mysql 클라이언트 라이브러리는 모든 열 값을 문자열로 받습니다. 열을 기본 유형으로 다시 변환하기 위해 더 이상 클라이언트 측 캐스팅이 수행되지 않습니다. 대신 모든 값이 PHP 문자열로 제공됩니다.

예제 #4 텍스트 프로토콜은 기본적으로 문자열을 반환합니다.

                  
<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))");
$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')");

$result = $mysqli->query("SELECT id, label FROM test WHERE id = 1");
$row = $result->fetch_assoc();

printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));
                  
                

위의 예는 다음을 출력합니다.

id = 1 (string)
label = a (string)
                

mysqlnd 라이브러리를 사용하는 경우 MYSQLI_OPT_INT_AND_FLOAT_NATIVE 연결 옵션을 설정하여 정수 및 부동 열을 다시 PHP 숫자로 변환할 수 있습니다. 설정되면 mysqlnd 라이브러리는 결과 집합 메타 데이터 열 유형을 확인하고 PHP 데이터 유형 값 범위가 허용하는 경우 숫자 SQL 열을 PHP 숫자로 변환합니다. 예를 들어 이러한 방식으로 SQL INT 열은 정수로 반환됩니다.

예제 #5 mysqlnd 및 연결 옵션이 있는 기본 데이터 유형

                  
<?php

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = new mysqli();
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
$mysqli->real_connect("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))");
$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')");

$result = $mysqli->query("SELECT id, label FROM test WHERE id = 1");
$row = $result->fetch_assoc();

printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));
                  
                

위의 예는 다음을 출력합니다.

id = 1 (integer)
label = a (string)
                
기타