cari

Rumah  >  Soal Jawab  >  teks badan

Membina pertanyaan SELECT sebagai pernyataan yang disediakan mysqli menggunakan bilangan keadaan LIKE yang dinamik

Saya cuba menulis kenyataan yang disediakan untuk input pengguna. Bilangan parameter berubah berdasarkan input pengguna. Oam sedang mencuba kod ini

Kod PHP:

$string          = "my name";
$search_exploded = explode( " ", $string );
$num             = count( $search_exploded );
$cart            = array();
for ( $i = 1; $i <= $num; $i ++ ) {
    $cart[] = 's';
}
$str          = implode( '', $cart );
$inputArray[] = &$str;
$j            = count( $search_exploded );
for ( $i = 0; $i < $j; $i ++ ) {
    $inputArray[] = &$search_exploded[ $i ];
}
print_r( $inputArray );
foreach ( $search_exploded as $search_each ) {
    $x ++;
    if ( $x == 1 ) {
        $construct .= "name LIKE %?%";
    } else {
        $construct .= " or name LIKE %?%";
    }
}
$query = "SELECT * FROM info WHERE $construct";
$stmt  = mysqli_prepare( $conn, $query );
call_user_func_array( array( $stmt, 'bind_param' ), $inputArray );
if ( mysqli_stmt_execute( $stmt ) ) {

    $result = mysqli_stmt_get_result( $stmt );
    if ( mysqli_num_rows( $result ) > 0 ) {
        echo $foundnum = mysqli_num_rows( $result );
        while( $row = mysqli_fetch_array( $result, MYSQLI_ASSOC ) ) {

            echo $id = $row['id'];
            echo $name = $row['name'];
        }
    }
}

Apabila saya print_r($inputArray) keluarannya ialah:

Array ( [0] => ss [1] => my [2] => name )

Tiada ralat ditunjukkan dalam log ralat.

Apa yang berlaku?

P粉269847997P粉269847997233 hari yang lalu358

membalas semua(2)saya akan balas

  • P粉826429907

    P粉8264299072024-03-26 14:50:12

    Tulis pengendali pertanyaan generik dan hantar pertanyaan anda, tatasusunan parameter dan senarai jenis parameter. Mengembalikan set hasil atau mesej. Ini adalah versi mysqli peribadi saya sendiri (saya kebanyakannya menggunakan PDO, tetapi mempunyai fungsi yang sama disediakan untuk ini). Lakukan perkara yang sama untuk sisipan, kemas kini dan pemadaman. Kemudian hanya kekalkan satu pustaka anda dan gunakannya untuk semua yang anda lakukan :) Ambil perhatian bahawa jika anda bermula dengan ini, anda mungkin mahu menangani ralat sambungan dsb. dengan lebih baik.

    connect_error) {
          return false;
        }
        return $con;
    }
    
    // generic select function.
    // takes a query string, an array of parameters, and a string of
    // parameter types
    // returns an array - 
    //   if $retVal[0] is true, query was successful and returned data
    //   and $revVal[1...N] contain the results as an associative array
    //   if $retVal[0] is false, then $retVal[1] either contains the 
    //   message "no records returned" OR it contains a mysql error message
    
    function selectFromDB($query,$params,$paramtypes){
    
        // intitial return;
        $retVal[0]=false;
    
        // establish connection
        $con = getDBConnection();
        if(!$con){
            die("db connection error");
            exit;
        }
    
        // sets up a prepared statement
        $stmnt=$con->prepare($query);
        $stmnt->bind_param($paramtypes, ...$params);
        $stmnt->execute();
    
        // get our results
        $result=$stmnt->get_result()->fetch_all(MYSQLI_ASSOC);
        if(!$result){
        $retVal[1]="No records returned";
        }else{
            $retVal[0]=true;
            for($i=0;$iclose();
    
        return $retVal;
    
    }
    
    $myusername=$_POST['username'];
    $mypassword=$_POST['password'];
    
    // our query, using ? as positional placeholders for our parameters
    $q="SELECT useridnum,username FROM users WHERE username=? and password=?";
    
    // our parameters as an array - 
    $p=array($myusername,$mypassword);
    
    // what data types are our params? both strings in this case
    $ps="ss";
    
    // run query and get results
    $result=selectFromDB($q,$p,$ps);
    
    // no matching record OR a query error
    if(!$result[0]){
        if($result[1]=="no records returned"){
            // no records
            // do stuff
        }else{
            // query error
            die($result[1]);
            exit;
        }   
    }else{  // we  have matches!
        for($i=1;$i$val){
                print("key:".$key." -> value:".$val);
            }
        }
    }
    
    ?>

    balas
    0
  • P粉787806024

    P粉7878060242024-03-26 12:36:45

    % Parameter sekeliling, bukan ruang letak.

    Coretan kod saya akan menggunakan sintaks mysqli berorientasikan objek, bukannya sintaks prosedur yang ditunjukkan oleh kod anda.

    Mula-mula anda perlu menyediakan bahan-bahan yang diperlukan:

    1. WHERE ungkapan klausa -- dipisahkan dengan ATAU
    2. Nilai jenis data - nilai anda ialah rentetan, jadi gunakan "s"
    3. Parameter untuk diikat pada pernyataan yang disediakan

    Saya akan menggabungkan #2 dan #3 menjadi pembolehubah untuk "membongkar" lebih mudah menggunakan operator percikan (...). Rentetan jenis data mestilah elemen pertama, kemudian satu atau lebih elemen akan mewakili nilai terikat.

    Sebagai kemasukan logik, jika tiada syarat dalam klausa WHERE, tidak ada faedah dalam menggunakan pernyataan yang disediakan hanya menanyakan jadual secara langsung.

    Kod: (PHPize.demo dalam talian)

    $string = "Bill N_d Dave";
    
    $conditions = [];
    $parameters = [''];
    foreach (array_unique(explode(' ', $string)) as $value) {
        $conditions[] = "name LIKE ?";
        $parameters[0] .= 's';
        // $value = addcslashes($value, '%_'); // if you want to make wildcards from input string literal. https://stackoverflow.com/questions/18527659/how-can-i-with-mysqli-make-a-query-with-like-and-get-all-results#comment132930420_36593020
        $parameters[] = "%{$value}%";
    }
    // $parameters now holds ['sss', '%Bill%', '%N_d%', '%Dave%']
    
    $query = "SELECT * FROM info";
    if ($conditions) {
        $stmt = $mysqli->prepare($query . ' WHERE ' . implode(' OR ', $conditions));
        $stmt->bind_param(...$parameters);
        $stmt->execute();
        $result = $stmt->get_result();
    } else {
        $result = $conn->query($query);
    }
    foreach ($result as $row) {
        echo "
    {$row['name']}
    \n"; }

    Untuk sesiapa yang mencari teknik pertanyaan dinamik yang serupa:

    balas
    0
  • Batalbalas