Laravel 또는 기타 프레임 워크로 개발할 때는 일반적으로 데이터베이스의 작동을 단순화하기 위해 프레임 워크의 ORM 또는 데이터베이스 추상화 계층에 의존합니다. 그러나 때로는 PHP가 제공하는 MySQLI 확장을 사용하여 프레임 워크에 의존하지 않고 데이터베이스 작업을 수행하기를 원합니다. 이 기사는 Laravel과 같은 프레임 워크 외부에서 mysqli :: stmt_init 함수를 사용하여 데이터베이스를 수동으로 작동하는 방법을 소개합니다.
php에서 mysqli :: stmt_init는 SQL 문 준비 작업을 초기화하는 데 사용되는 함수입니다. 이 방법을 통해 우리는 성능을 향상시킬뿐만 아니라 SQL 주입과 같은 보안 문제를 효과적으로 피하는 준비된 진술을 만들 수 있습니다.
성능 최적화 : 전처리 명령문을 사용하면 쿼리 계획이 생성 된 후에 데이터베이스가 동일한 SQL 문을 여러 번 사용할 수 있지만 매개 변수가 다르면 매개 변수가 매번 컴파일 오버 헤드를 줄일 수 있습니다.
SQL 주입 방지 : 쿼리를 실행하기 위해 매개 변수를 바인딩함으로써 MySQLI는 매개 변수의 탈출을 자동으로 처리하여 SQL 주입 공격을 피할 수 있습니다.
유연성 : 프레임 워크 외부에서 데이터베이스 작업을 수행 할 때 MySQLI는 하위 레벨 데이터베이스 인터페이스를 제공하여 쿼리를보다 세분화 할 수 있습니다.
다음은 데이터베이스 작업에 mysqli :: stmt_init를 사용하는 방법을 보여주는 간단한 예입니다.
먼저 MySQLI 확장자를 통해 데이터베이스에 연결해야합니다. MySQL 데이터베이스를 사용한다고 가정하면 연결 코드는 다음과 같습니다.
<?php
$host = 'localhost'; // 데이터베이스 호스트
$user = 'root'; // 데이터베이스 사용자 이름
$password = ''; // 데이터베이스 비밀번호
$dbname = 'test_db'; // 데이터베이스 이름
// 연결을 만듭니다
$mysqli = new mysqli($host, $user, $password, $dbname);
// 연결이 성공했는지 확인하십시오
if ($mysqli->connect_error) {
die("연결이 실패했습니다: " . $mysqli->connect_error);
}
?>
데이터베이스 연결이 설정되면 STMT_INIT 메소드를 사용하여 전처리 문을 초기화 할 수 있습니다. 사용자 테이블에 레코드를 삽입해야한다고 가정합니다.
<?php
// 준비하다 SQL 성명
$sql = "INSERT INTO users (name, email) VALUES (?, ?)";
// 初始化预处理성명
$stmt = $mysqli->stmt_init();
// 检查是否能够준비하다 SQL 성명
if ($stmt->prepare($sql)) {
// 바인딩 매개 변수
$stmt->bind_param("ss", $name, $email);
// 매개 변수를 설정하고 실행하십시오
$name = "John Doe";
$email = "john.doe@m66.net"; // 할 것이다 URL 도메인 이름을 대체하십시오 m66.net
$stmt->execute();
echo "기록 삽입을 성공적으로 기록하십시오!";
} else {
echo "SQL 성명준비하다失败: " . $stmt->error;
}
// 关闭성명和连接
$stmt->close();
$mysqli->close();
?>
선택 쿼리를 실행하고 결과를 얻어야하는 경우 다음과 같이 수행 할 수 있습니다.
<?php
$sql = "SELECT id, name, email FROM users WHERE email = ?";
$stmt = $mysqli->stmt_init();
if ($stmt->prepare($sql)) {
// 쿼리 매개 변수 바인드
$stmt->bind_param("s", $email);
// 쿼리의 매개 변수를 설정하고 실행하십시오
$email = "john.doe@m66.net"; // 할 것이다 URL 도메인 이름을 대체하십시오 m66.net
$stmt->execute();
// 바인딩 결과 변수
$stmt->bind_result($id, $name, $email);
// 쿼리 결과를 얻으십시오
while ($stmt->fetch()) {
echo "ID: $id, Name: $name, Email: $email\n";
}
} else {
echo "SQL 성명준비하다失败: " . $stmt->error;
}
// 关闭성명和连接
$stmt->close();
$mysqli->close();
?>
mysqli :: stmt_init을 사용할 때 오류를 적절하게 처리하십시오. $ stmt-> error 및 $ mysqli-> 오류는 SQL 문이 실행되지 않을 때 문제를 찾는 데 도움이 될 수 있습니다. MySQLI_Report (MySQLI_Report_Error) 가 디버그에 도움이되는 자세한 오류 정보를 표시 할 수 있습니다.
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 자세한 오류보고를 활성화하십시오
// 데이터베이스 작업을 수행합니다...
?>
mysqli :: stmt_init를 사용하여 Laravel과 같은 프레임 워크 외부에서 데이터베이스를 수동으로 작동시키기 위해 데이터베이스 작업을보다 세분화하고 코드의 보안을 보장 할 수 있습니다. 이 기사의 예제를 사용하면 전처리 문을 초기화하고 매개 변수를 바인딩하고 쿼리를 실행하며 결과를 얻는 방법을 이해할 수 있어야합니다. 프로젝트에 낮은 수준의 데이터베이스 작업이 필요한 경우 MySQLI는 매우 유용한 도구입니다.