PHP MySQLi 함수: mysqli_query 및 mysqli_connect

⚡ 스마트 요약

MySQLPHP의 mysqli 및 기타 데이터베이스 접근 방식을 사용하면 PHP 스크립트가 데이터베이스에 연결하고 쿼리를 실행하고 결과를 읽을 수 있습니다. 이 가이드에서는 mysqli의 핵심 기능, 전체 CRUD 예제, 보안을 위한 준비된 문(prepared statement), 그리고 대체 접근 방식인 PDO와 ODBC에 대해 다룹니다.

  • 🔌 연결 중 : mysqli_connect는 링크를 엽니다. MySQL 서버에서 mysqli_select_db 함수가 사용할 데이터베이스를 선택합니다.
  • 🗃️ 쿼리 실행 중: mysqli_query는 선택한 데이터베이스에 대해 INSERT, SELECT, UPDATE 및 DELETE 문을 실행합니다.
  • 📄 읽기 결과: `mysqli_num_rows`는 반환된 행 수를 세고, `mysqli_fetch_array`는 각 행을 배열로 읽어 출력합니다.
  • 🔄 크루드 Operations : 이러한 기능들을 종합하면 데이터베이스의 네 가지 핵심 작업인 레코드 생성, 읽기, 업데이트 및 삭제가 가능합니다.
  • 🛡️ 준비된 진술서: 준비된 문장을 사용하여 값을 바인딩하면 사용자 입력을 연결하여 쿼리를 구성하는 것과 달리 SQL 인젝션을 방지할 수 있습니다.
  • 🧩 PDO 및 ODBC: PDO는 여러 데이터베이스 엔진에서 단일 인터페이스를 제공하는 반면, ODBC는 다음과 같은 소스에 연결합니다. Microsoft 접속하다.
  • 🤖 AI 지원: AI 도구는 기존 mysqli 코드를 준비된 문장을 사용하는 PDO로 변환하고 연결 오류를 디버깅할 수 있습니다.

PHP MySQL 데이터베이스 액세스

PHP는 조작을 위한 풍부한 내장 함수 모음을 제공합니다. MySQL 데이터베이스.

PHP mysqli_connect 함수

PHP의 mysqli_connect 함수는 데이터베이스에 연결하는 데 사용됩니다. MySQL 데이터베이스 서버.

구문은 다음과 같습니다.

<?php
$db_handle = mysqli_connect($db_server_name, $db_user_name, $db_password);
?>

이리,

  • “$db_handle”은 데이터베이스 연결 리소스 변수입니다.
  • “mysqli_connect(…)”는 PHP 데이터베이스 연결 함수입니다.
  • "$db_server_name"은 데이터베이스를 호스팅하는 서버의 이름 또는 IP 주소입니다. MySQL 서버.
  • "$db_user_name"은 유효한 사용자 이름입니다. MySQL 서버.
  • “$db_password”는 사용자 이름과 연결된 유효한 암호입니다. MySQL 서버.

PHP mysqli_select_db 함수

mysqli_select_db 함수는 데이터베이스를 선택하는 데 사용됩니다.

구문은 다음과 같습니다.

<?php
mysqli_select_db($db_handle, $database_name);
?>

이리,

  • “mysqli_select_db(…)”는 true 또는 false를 반환하는 데이터베이스 선택 함수입니다.
  • "$db_handle"은 서버 연결 링크입니다.
  • "$database_name"은 데이터베이스의 이름입니다.

PHP mysqli_query 함수

mysqli_query 함수는 다음을 실행하는 데 사용됩니다. SQL 검색어.

이 함수는 다음과 같은 유형의 쿼리를 실행하는 데 사용할 수 있습니다.

  • 끼워 넣다
  • 선택
  • 업데이트
  • .

구문은 다음과 같습니다.

<?php
mysqli_query($db_handle, $query);
?>

이리,

  • “mysqli_query(…)”는 SQL 쿼리를 실행하는 함수입니다.
  • "$db_handle"은 서버 연결 링크입니다.
  • "$query"는 실행할 SQL 쿼리입니다.

PHP mysqli_num_rows 함수

mysqli_num_rows 함수는 SELECT 쿼리에서 반환된 행의 수를 가져오는 데 사용됩니다.

구문은 다음과 같습니다.

<?php
mysqli_num_rows($result);
?>

이리,

  • “mysqli_num_rows(…)”는 행 개수 함수입니다.
  • “$result”는 mysqli_query 결과 세트입니다.

PHP mysqli_fetch_array 함수

mysqli_fetch_array 함수는 쿼리 결과 집합에서 행 배열을 가져오는 데 사용됩니다.

구문은 다음과 같습니다.

<?php
mysqli_fetch_array($result);
?>

이리,

  • “mysqli_fetch_array(…)”는 행 배열을 페치하기 위한 함수입니다.
  • “$result”는 mysqli_query 함수가 반환하는 결과입니다.

PHP mysqli_close 함수

mysqli_close 함수는 열려 있는 데이터베이스 연결을 닫는 데 사용됩니다.

구문은 다음과 같습니다.

<?php
mysqli_close($db_handle);
?>

이리,

  • “mysqli_close(…)”는 연결을 닫는 PHP 함수입니다.
  • "$db_handle"은 서버 연결 리소스입니다.

PHP MySQL CRUD 예시

이러한 기능을 활용하는 실제 사례를 살펴보겠습니다. 이 튜토리얼은 다음 내용을 알고 있다고 가정합니다. MySQL 그리고 SQL; 이러한 용어가 익숙하지 않다면, 저희 자료를 참조하십시오. MySQL 그리고 SQL 튜토리얼.

우리는 my_personal_contacts라는 이름의 간단한 데이터베이스를 만들고 테이블 하나만 생성하겠습니다. 연결하세요. MySQL 다음과 같이 즐겨 사용하는 액세스 도구를 사용하여 MySQL Workbench 또는 phpMyAdmin을 사용하여 my_personal_contacts라는 데이터베이스를 생성한 다음, 아래 스크립트를 실행하여 테이블을 생성하고 더미 데이터를 삽입하십시오.

CREATE TABLE IF NOT EXISTS `my_contacts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`full_names` varchar(255) NOT NULL,
`gender` varchar(6) NOT NULL,
`contact_no` varchar(75) NOT NULL,
`email` varchar(255) NOT NULL,
`city` varchar(255) NOT NULL,
`country` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

INSERT INTO `my_contacts` (`id`, `full_names`, `gender`, `contact_no`, `email`, `city`, `country`) VALUES
(1, 'Zeus', 'Male', '111', 'zeus@olympus.mt.co', 'Agos', 'Greece'),
(2, 'Anthena', 'Female', '123', 'anthena@olympus.mt.co', 'Athens', 'Greece'),
(3, 'Jupiter', 'Male', '783', 'jupiter@planet.pt.co', 'Rome', 'Italy'),
(4, 'Venus', 'Female', '987', 'venus@planet.pt.co', 'Mars', 'Italy');

데이터베이스에서 레코드 읽기

이제 데이터베이스의 레코드를 출력하는 프로그램을 만들어 보겠습니다.

<?php
$dbh = mysqli_connect('localhost', 'root', 'melody'); // connect to MySQL server
if (!$dbh)
    die("Unable to connect to MySQL: " . mysqli_connect_error());

if (!mysqli_select_db($dbh, 'my_personal_contacts'))
    die("Unable to select database: " . mysqli_error($dbh));

$sql_stmt = "SELECT * FROM my_contacts"; // SQL select query
$result = mysqli_query($dbh, $sql_stmt); // execute SQL statement

if (!$result)
    die("Database access failed: " . mysqli_error($dbh));

$rows = mysqli_num_rows($result); // get number of rows returned

if ($rows) {
    while ($row = mysqli_fetch_array($result)) {
        echo 'ID: ' . $row['id'] . '<br>';
        echo 'Full Names: ' . $row['full_names'] . '<br>';
        echo 'Gender: ' . $row['gender'] . '<br>';
        echo 'Contact No: ' . $row['contact_no'] . '<br>';
        echo 'Email: ' . $row['email'] . '<br>';
        echo 'City: ' . $row['city'] . '<br>';
        echo 'Country: ' . $row['country'] . '<br><br>';
    }
}
mysqli_close($dbh); // close the database connection
?>

위 코드를 실행하면 아래 다이어그램에 표시된 결과가 나타납니다.

PHP : MySQL 기능

새 레코드 삽입

이제 테이블에 새 레코드를 추가하는 예제를 살펴보겠습니다. 아래 코드는 구현 방법을 보여줍니다.

<?php
$dbh = mysqli_connect('localhost', 'root', 'melody'); // connect to MySQL server
if (!$dbh)
    die("Unable to connect to MySQL: " . mysqli_connect_error());

if (!mysqli_select_db($dbh, 'my_personal_contacts'))
    die("Unable to select database: " . mysqli_error($dbh));

$sql_stmt = "INSERT INTO `my_contacts` (`full_names`,`gender`,`contact_no`,`email`,`city`,`country`)";
$sql_stmt .= " VALUES(7,8,9,10,11,12)";

$result = mysqli_query($dbh, $sql_stmt); // execute SQL statement
if (!$result)
    die("Adding record failed: " . mysqli_error($dbh));

echo "Poseidon has been successfully added to your contacts list";
mysqli_close($dbh); // close the database connection
?>

위 코드를 실행하면 "포세이돈이 연락처 목록에 성공적으로 추가되었습니다."라는 메시지가 출력됩니다. 이전 선택 쿼리 예제로 돌아가서 연락처를 다시 불러와 포세이돈이 목록에 추가되었는지 확인하세요.

기록 업데이트 중

이제 데이터베이스의 기록을 업데이트하는 예를 살펴보겠습니다. 포세이돈이 연락처와 이메일 주소를 변경했다고 가정해 보겠습니다.

<?php
$dbh = mysqli_connect('localhost', 'root', 'melody'); // connect to MySQL server
if (!$dbh)
    die("Unable to connect to MySQL: " . mysqli_connect_error());

if (!mysqli_select_db($dbh, 'my_personal_contacts'))
    die("Unable to select database: " . mysqli_error($dbh));

$sql_stmt = "UPDATE `my_contacts` SET `contact_no` = 8, `email` = 9";
$sql_stmt .= " WHERE `id` = 5"; // SQL update query

$result = mysqli_query($dbh, $sql_stmt); // execute SQL statement
if (!$result)
    die("Updating record failed: " . mysqli_error($dbh));

echo "ID number 5 has been successfully updated";
mysqli_close($dbh); // close the database connection
?>

기록 삭제

이제 데이터베이스에서 기록을 삭제하는 예를 살펴보겠습니다. 비너스가 우리에게 접근금지 명령을 내렸고, 우리는 그녀의 연락처 정보를 데이터베이스에서 삭제해야 한다고 가정해 보겠습니다. 데이터베이스.

<?php
$dbh = mysqli_connect('localhost', 'root', 'melody'); // connect to MySQL server
if (!$dbh)
    die("Unable to connect to MySQL: " . mysqli_connect_error());

if (!mysqli_select_db($dbh, 'my_personal_contacts'))
    die("Unable to select database: " . mysqli_error($dbh));

$id = 4; // Venus's ID in the database
$sql_stmt = "DELETE FROM `my_contacts` WHERE `id` = $id"; // SQL delete query

$result = mysqli_query($dbh, $sql_stmt); // execute SQL statement
if (!$result)
    die("Deleting record failed: " . mysqli_error($dbh));

echo "ID number $id has been successfully deleted";
mysqli_close($dbh); // close the database connection
?>

준비된 문(Prepared Statements)을 사용하여 SQL 인젝션 방지

위의 CRUD 예제는 문자열을 연결하여 쿼리를 생성합니다. 쿼리의 일부가 사용자 입력에서 비롯될 경우 SQL 인젝션 공격에 취약해집니다. 준비된 문(Prepared statements)은 쿼리와 데이터를 분리하여 전송함으로써 이러한 문제를 해결하고, 입력으로 인해 쿼리 구조가 변경되는 것을 방지합니다.

<?php
$dbh = mysqli_connect('localhost', 'root', 'melody');
$stmt = mysqli_prepare($dbh, "INSERT INTO my_contacts (full_names, email) VALUES (?, ?)");
mysqli_stmt_bind_param($stmt, "ss", $name, $email);
$name = 'Poseidon';
$email = 'poseidon@sea.oc';
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
mysqli_close($dbh);
?>

여기서 물음표는 자리 표시자이며, bind_param은 이름과 이메일 값을 안전하게 바인딩합니다. 데이터베이스는 이 값들을 엄격하게 데이터로 취급하므로, mysqli와 PDO 모두에서 사용할 수 있는 준비된 문(prepared statements)을 사용하여 사용자 입력을 사용하는 모든 쿼리를 실행하는 것이 권장됩니다.

PHP 데이터 접근 객체(PDO)

PDO는 다양한 데이터베이스 엔진을 조작할 수 있게 해주는 클래스입니다. MySQL, PostgreSQLMS SQL Server도 동일한 인터페이스를 사용합니다.

아래 코드는 PDO 객체를 이용한 데이터베이스 접근 방법을 보여준다.

참고: 아래 코드는 SQL 언어, 배열, 예외 처리 및 foreach 루프에 대한 지식이 있다고 가정합니다.

<?php
try {
$pdo = new PDO("mysql:host=localhost;dbname=my_personal_contacts", 'root', 'melody');

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec('SET NAMES "utf8"');

$sql_stmt = "SELECT * FROM `my_contacts`";
$result = $pdo->query($sql_stmt);
$result->setFetchMode(PDO::FETCH_ASSOC);
$data = array();
foreach ($result as $row) {
$data[] = $row;
}
print_r($data);
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>

이리,

  • “try{…}catch{…}”는 예외 처리 블록입니다.
  • “$pdo = new PDO(“mysql…”는 PDO 객체의 인스턴스를 생성하고 데이터베이스 드라이버, 서버 및 데이터베이스 이름, 사용자 ID 및 암호를 전달합니다.
  • "$pdo->setAttribute…"는 PDO 오류 모드를 예외 발생 모드로 설정합니다.
  • “$pdo->exec('SET NAMES…')는 인코딩 형식을 설정합니다.

PHP ODBC 데이터 액세스

ODBC는 Open Database Connectivity의 약자입니다. 기본 구문은 다음과 같습니다.

<?php
$conn = odbc_connect($dsn, $user_name, $password);
?>

이리,

  • “odbc_connect”는 PHP 내장 함수입니다.
  • "$dsn"은 ODBC 데이터 소스 이름입니다.
  • "$user_name"은 선택 사항이며 ODBC 사용자 이름으로 사용됩니다.
  • "$password"는 선택 사항이며 ODBC 암호로 사용됩니다.

아래 예시는 사용자가 다음을 사용하고 있다고 가정합니다. Windows 그리고 Northwind에 대한 ODBC 링크를 생성했습니다. Microsoft Northwind라는 이름의 데이터베이스에 액세스하세요.

<?php
$dbh = odbc_connect('northwind', '', '');
if (!$dbh) {
exit("Connection Failed: " . $dbh);
}
$sql_stmt = "SELECT * FROM customers";
$result = odbc_exec($dbh, $sql_stmt);
if (!$result) {
exit("Error accessing records");
}
while (odbc_fetch_row($result)) {
$company_name = odbc_result($result, "CompanyName");
$contact_name = odbc_result($result, "ContactName");
echo "<b>Company Name (Contact Person):</b> $company_name ($contact_name) <br>";
}
odbc_close($dbh);
?>

자주 묻는 질문

mysqli는 다음 경우에만 작동합니다. MySQL PDO는 절차적 스타일과 객체적 스타일을 모두 제공합니다. PDO는 하나의 인터페이스를 통해 여러 데이터베이스와 연동되며 명명된 플레이스홀더를 지원합니다. 두 프레임워크 모두 준비된 문(prepared statements)을 지원하지만, PDO는 엔진 간 이식성이 더 뛰어납니다.

아니요. 기존의 mysql_* 확장 함수는 PHP 7에서 제거되었습니다. 대신 mysqli 또는 PDO를 사용하세요. 두 함수 모두 활발하게 유지 관리되고 있으며, 준비된 문(prepared statement)을 지원하고, 기존 확장 함수의 인젝션 위험으로부터 보호해 줍니다.

오류를 포착하여 사용자에게 일반적인 메시지를 표시하고, 오류 세부 정보는 비공개로 로그에 기록합니다. mysqli_error의 출력은 방문자에게 노출되지 않도록 해야 합니다. 테이블 이름과 구조가 공격자에게 유용할 수 있기 때문입니다.

네. mysqli 스크립트를 붙여넣으면 AI가 PDO를 사용하여 다시 작성하고, 연결된 쿼리를 바인딩된 매개변수로 대체하고, try-catch 오류 처리를 추가할 수 있습니다. Rev플레이스홀더를 확인하고 각 쿼리를 테스트해 보세요.

네. 오류 메시지와 연결 코드를 공유해 주시면 AI가 잘못된 자격 증명, 잘못된 호스트 또는 포트, 누락된 데이터베이스 또는 비활성화된 드라이버를 감지하여 시도해 볼 수 있는 올바른 설정을 제안해 드립니다.

이 게시물을 요약하면 다음과 같습니다.