복붙노트

PHP는 mysqli 준비 성명

PHP

PHP는 mysqli 준비 성명

어떻게하면 mysqli가 LIKE로 질의를하고 모든 결과를 얻을 수 있습니까?

이것은 내 코드이지만 작동하지 않습니다.

$param = "%{$_POST['user']}%";
$stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE ?");
$stmt->bind_param("s", $param);
$stmt->execute();
$stmt->bind_result($id,$username);
$stmt->fetch();

이 코드는 작동하지 않는 것 같습니다. 나는 그것을 많이 찾았다. 또한 1 행 이상을 반환 할 수 있습니다. 그렇다면 1 행 이상을 반환하더라도 모든 결과를 얻으려면 어떻게해야합니까?

해결법

  1. ==============================

    1.결과를 올바르게 가져 오는 방법은 다음과 같습니다.

    결과를 올바르게 가져 오는 방법은 다음과 같습니다.

    $param = "%{$_POST['user']}%";
    $stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE ?");
    $stmt->bind_param("s", $param);
    $stmt->execute();
    $stmt->bind_result($id,$username);
    
    while ($stmt->fetch()) {
      echo "Id: {$id}, Username: {$username}";
    }
    

    또는 다음 작업을 수행 할 수도 있습니다.

    $param = "%{$_POST['user']}%";
    $stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE ?");
    $stmt->bind_param("s", $param);
    $stmt->execute();
    
    $result = $stmt->get_result();
    while ($row = $result->fetch_array(MYSQLI_NUM)) {
      foreach ($row as $r) {
        print "$r ";
      }
      print "\n";
    }
    

    나는 당신이 먼저 갔어야하는 곳인 이곳과 여기에있는 매뉴얼에서 직접 대답을 얻었음을 알기를 바랍니다.

  2. ==============================

    2.주석에서 Paramaterised 쿼리에 대해 LIKE 와일드 카드 문자 (_and %)가 기본적으로 이스케이프되지 않으므로 예기치 않은 결과가 발생할 수 있습니다.

    주석에서 Paramaterised 쿼리에 대해 LIKE 와일드 카드 문자 (_and %)가 기본적으로 이스케이프되지 않으므로 예기치 않은 결과가 발생할 수 있습니다.

    따라서 "LIKE"문을 사용할 때 이러한 '음수 미리보기'Regex를 사용하여 이러한 문자가 이스케이프되는지 확인하십시오.

    $param = preg_replace('/(?<!\\\)([%_])/g', '\\\$1',$param);
    

    위의 답변에 대한 대안으로 MySQL CONCAT 함수를 사용할 수도 있습니다 :

    $stmt = $db->prepare("SELECT id,Username FROM users WHERE Username LIKE CONCAT('%',?,'%') ");
    $stmt->bind_param("s", $param);
    $stmt->execute();
    

    즉, $ param 값을 편집 할 필요가 없지만 약간 더 긴 쿼리를 작성합니다.

  3. from https://stackoverflow.com/questions/18527659/php-mysqli-prepared-statement-like by cc-by-sa and MIT license