Membina pertanyaan SELECT sebagai pernyataan yang disediakan mysqli menggunakan bilangan keadaan LIKE yang dinamik
P粉269847997
P粉269847997 2024-03-25 23:18:00
0
2
390

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粉269847997
P粉269847997

membalas semua(2)
P粉826429907

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);
        }
    }
}

?>
P粉787806024

% 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:

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan