이것은이 질문과 유사합니다 - Are Dynamic Prepared Statements Bad? (with php + mysqli), 그러나 4 세 이후로 나는 더 많은 최신 답변을 얻고 싶었습니다.동적 준비 진술 - 보안 구멍이 열렸습니까?
필자는 더 많은 copmlex sql 쿼리를 테스트하지는 않았지만 단순한 sql 쿼리에서는 실패하지 않고 작업을 수행했다.하지만 그렇게하면 주 메뉴 중 하나를 건너 뛸지 잘 모르겠다. 준비된 진술의 이유 - 보안.
나는 bind_result
이 다소 까다 롭습니다 만 bind_param
문과 함께 충분히 쉬워 진 call_user_func_array
을 사용했습니다. 원래는 get_result
을 사용했지만 내가 사용하지 않은 호스트는 mysqlnd
을 사용할 수 없었지만 메타 데이터를 사용하여 해결할 수있었습니다. 이것은 제가 작성한 전체 수업입니다.
안전하다고 생각하십니까? 숫자 전달
은 :
$sql
는 SQL 문에 전달됩니다SELECT * FROM users WHERE id = ? AND created_timestamp > ?
$mysqli
가 mysqli 연결$para
인 제조에 자리이고 성명 :array ($types = 'ii', 23, 1235376000)
클래스 :
class crudModel {
function ps($sql, $mysqli, $para) {
//this function should work for just about any simple mysql statement
//for more complicated stuff like joins, unions etc,. we will see
if ($prep = $mysqli->prepare($sql)) {
call_user_func_array(array($prep, 'bind_param'), $this->makeValuesRef($para, $mysqli));
$prep->execute();
$meta = $prep->result_metadata();
while ($field = $meta->fetch_field()) {
$parameters[] = &$row[$field->name];
}
call_user_func_array(array($prep, 'bind_result'), $parameters);
while ($prep->fetch()) {
foreach ($row as $key=>$val) {
$x[$key] = $val;
}
$data[] = $x;
}
return $data;
}
}
function makeValuesRef($array, $mysqli) {
$refs = array();
foreach($array as $key => $value) {
$array[$key] = $mysqli->real_escape_string($value); //i don't think escaping is necessary, but it can't hurt (??)
$refs[$key] = &$array[$key];
}
return $refs;
}
}
어디에서'$ sql'이 시작 되었습니까? – eggyal
mysqli 대신 PDO를 사용하면 PDO 객체 계층이 MySql뿐 아니라 대부분의 DBMS와 호환되므로 코드가 더 이식성이 높아집니다. –
다른 클래스의 $ sql. 당분간 나는이 클래스를 테스트하기 위해 간단한 SQL 문을 사용했다. 조인은 내가 사용 해본 가장 복잡한 것들이다. 즉 $ sql = "SELECT * FROM users INNER JOIN ON (users.id = others.user_id) WHERE others.id =?" –