PHP에서 mysqli 전처리 준비

不言
풀어 주다: 2023-04-02 12:36:01
원래의
2638명이 탐색했습니다.

이 글은 주로 PHP에서 mysqli의 전처리 준비를 소개합니다. 이제 특정 참조 값을 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.

PHP에서 mysqli의 전처리 준비

1 , [PHP 오류] 매개변수 2를 참조로 전달할 수 없습니다.

이 오류는 두 번째 매개변수를 참조로 전달할 수 없음을 의미합니다.
이 오류가 발생하는 이유는 바인딩_param() 메서드에서 데이터 유형을 나타내는 첫 번째 매개변수 외에
다음 매개변수를 사용해야 하기 때문입니다. 다른 매개변수는 참조로 전달되기 때문에 직접 수량 대신 변수를 사용하세요.

$sql = "select * from tmp where myname=? or sex =?";
$stmt = $mysqli->conn->prepare($sql);
$name ="a";
$sex="b";
$stmt->bind_param('ss',$name,$sex);//必须要这样传参,且在mysqli等的预处理参数绑定中,必须要指定参数的类型且只能一次性绑定全部参数,不能像PDO那样一个个绑定

//$stmt->bind_param('ss',"a","b");
//这种方式的会报错:Fatal error: Cannot pass parameter 2 by reference$stmt->execute();
if($mysqli->conn->affected_rows){    
$result = $stmt->get_result();    
while($row = $result->fetch_assoc()){        
var_dump($row);
    }
}
로그인 후 복사

2. SQL 주입을 방지하려면 PHP에서 addlashes 및 mysql_real_escape_string을 사용하지 마세요

addlashes를 사용하든 mysql_real_escape_string을 사용하든 코딩 취약점을 사용할 수 있습니다. 비밀번호를 입력하면 서버에 로그인할 수 있는 주입 공격을 달성하세요! ! ! ! (공격 원리에 대해서는 자세히 설명하지 않겠습니다. 관심 있는 학생들은 문자 인코딩의 단일 바이트 및 다중 바이트 문제를 연구할 수 있습니다.) 현재 인코딩을 확인할 방법은 없습니다. 클라이언트 인코딩을 동시에 수행하면 인코딩 문제가 발생하는 것을 방지할 수 있습니다. SQL 주입은 어느 정도 방지할 수 있지만, 여전히 다음과 같은 완벽한 솔루션을 권장합니다. 완벽한 해결책은 mysql_query 대신 준비된 문 메커니즘과 함께 PDO 및 MYSQLi를 사용하는 것입니다(참고: mysql_query는 PHP 5.5.0부터 더 이상 사용되지 않으며 향후 제거될 예정입니다):

PDO:

$pdo = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
 
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(array('name' => $name));
 
foreach ($stmt as $row) {
// do something with $row
로그인 후 복사

MYSQLI:

$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);
 
$stmt->execute();
 
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// do something with $row
}
로그인 후 복사
로그인 후 복사

PDO:

  1. $pdo = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
    
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    
    $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
    
    
    $stmt->execute(array('name' => $name));
    
     
    
    
    foreach ($stmt as $row) {
    
    
    // do something with $row
    
    
    }
    로그인 후 복사
MYSQLi:

$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);
 
$stmt->execute();
 
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// do something with $row
}
로그인 후 복사
로그인 후 복사
이 오류는 두 번째 매개변수를 참조로 전달할 수 없음을 의미합니다. 이 오류는 다음을 제외하고는 다음과 같습니다 데이터 유형을 나타내는 첫 번째 매개변수인 Bind_param() 메소드에서는 다른 매개변수가 참조로 전달되므로 직접 수량 대신 변수를 사용해야 합니다. 위 내용이 모두에게 도움이 되기를 바랍니다. 학습에 도움이 됩니다. 더 많은 관련 내용을 보시려면 PHP 중국어 웹사이트를 주목해주세요! 관련 권장 사항:

PHP가 링크의 유효성을 결정하는 방법



PHP와 웹 페이지 간의 상호 작용

위 내용은 PHP에서 mysqli 전처리 준비의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿