이 글은 주로 PHP에서 mysqli의 전처리 준비를 소개합니다. 이제 특정 참조 값을 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.
이 오류는 두 번째 매개변수를 참조로 전달할 수 없음을 의미합니다.
이 오류가 발생하는 이유는 바인딩_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:
$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 }
$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
}
PHP가 링크의 유효성을 결정하는 방법
PHP와 웹 페이지 간의 상호 작용
위 내용은 PHP에서 mysqli 전처리 준비의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!