php - stmt - prepare mysqli insert




文字列の配列のmysqli bind_param (2)

私はこれを働かせることはできません。 私は今、それに何時間も費やしてきました。

これは動作します:

$mysqli = new mysqli("localhost", "root", "root", "db");
if(!$mysqli || $mysqli->connect_errno)
{
    return;
}
$query_str= "SELECT name FROM table WHERE city IN ('Nashville','Knoxville')";
if($query_prepared && $query_prepared->prepare($query_str))
{       
    $query_prepared->execute();

しかし、私はこのようにbind_paramを使うことはできません:

$query_str= "SELECT name FROM table WHERE city IN (?)";
$query_prepared = $mysqli->stmt_init();
if($query_prepared && $query_prepared->prepare($query_str))
{       
    $cities= explode(",", $_GET['cities']);
    $str_get_cities=  "'".implode("','", $get_cities)."'"; // This equals 'Nashville','Knoxville'

    $query_prepared->bind_param("s", $cities);
    $query_prepared->execute();

私は間違って何をしていますか?

私もcall_user_func_arrayを試しましたが、正しい構文を得ることができません。 どんな助けでも大歓迎です!

編集:私は徹底的にmoskito-xの提案とここにリストされているたくさんの例を試しました。そうでなければSOやランダムなウェブサイトでは何も動作しません。 私の問題はPHP 5.4であると思います。これは私のMAMPが現在設定されているものです。

https://code.i-harness.com


1つのquestion mark 2つの変数をバインドすることはできません!

バインドする変数ごとに、 question mark 1つが必要です

"bind_param"は、各変数が要件に一致するかどうかをチェックします。 その後、文字列の値は引用符の間に置かれます。

これは動作しません。

"SELECT name FROM table WHERE city IN (?)"; ( becomes too )
$q_prepared->bind_param("s", $cities);
"SELECT name FROM table WHERE city IN ('city1,city2,city3,city4')";

でなければなりません。

"SELECT name FROM table WHERE city IN (?,?,?,?)"; ( becomes too )
$q_prepared->bind_param("ssss", $city1,$city2,$city3,$city4);
"SELECT name FROM table WHERE city IN ('city1','city2','city3','city4')";

$query_prepared->bind_paramは、文字列$query_prepared->bind_param 1つずつ引用します。
変数の数と文字列型の長さは、文のパラメータと一致する必要があります。

$query_str= "SELECT name FROM table WHERE city IN ('Nashville','Knoxville')";

となります

$query_str= "SELECT name FROM table WHERE city IN (?,?)";

今すぐbind_param必要があります

bind_param("ss",$arg1,$arg2)

これとともに

$query_str= "SELECT name FROM table WHERE city IN (?)";

bind_param

bind_param("s",$cities)

あなたは得る

$query_str= "SELECT name FROM table WHERE city IN ('Nashville,Knoxville')";

そのためアレイは機能しません。
この事実の唯一の解決策はcall_user_func_array

ステートメントを起動すると、以下は不要です

$query_prepared = $mysqli->stmt_init();
if($query_prepared && $query_prepared->prepare($query_str)) {

これは正しいです

$query_prepared = $mysqli->stmt_init();
if($query_prepared->prepare($query_str)) {

call_user_func_arrayを使用したくない場合
あなたは議論の数が少ないだけです
あなたは次のコードでそれを行うことができます。

[...]
$cities= explode(",", $_GET['cities']);
if (count($cities)>3) { echo "too many arguments"; }
else
{ 
$count = count($cities); 
$SetIn = "(";
  for($i = 0; $i < $count; ++$i) {    
      $code.='s';
      if ($i>0) {$SetIn.=",?";} else {$SetIn.="?";}
  }
$SetIn.=")";
$query_str= "SELECT name FROM table WHERE city IN ".$SetIn;
// with 2 arguments $query_str will look like
// SELECT name FROM table WHERE city IN (?,?)
$query_prepared = $mysqli->stmt_init();
if($query_prepared->prepare($query_str))
  {       
    if ($count==1) { $query_prepared->bind_param($code, $cities[0]);}
    if ($count==2) { $query_prepared->bind_param($code, $cities[0],$cities[1]);}
    if ($count==3) { $query_prepared->bind_param($code, $cities[0],$cities[1],$cities[2]);
    // with 2 arguments $query_prepared->bind_param() will look like
    // $query_prepared->bind_param("ss",$cities[0],$cities[1])      
  }    

    $query_prepared->execute();
  } 
 [...]
 }

call_user_func_array試してみることをお勧めします。

nick9vの解をnick9v
mysqli-stmt.bind-param


私もこれに問題があり、ほとんどの人がcall_user_func_arrayを使用していることを知る前にevalで作業していeval

$fields = array('model','title','price'); // fields in WHERE clause
$values = array( // type and value for each field
    array('s','ABCD-1001'),
    array('s','[CD] Test Title'),
    array('d','16.00')
);
$sql = "SELECT * FROM products_info WHERE "; // start of query
foreach ($fields as $current){ // build where clause from fields
    $sql .= '`' . $current . '` = ? AND ';
}
$sql = rtrim($sql,'AND '); // remove last AND 
$stmt = $db->prepare($sql);
$types = ''; $vals = '';
foreach ($values as $index => $current_val){ // build type string and parameters
    $types .= $current_val[0];
    $vals .= '$values[' . $index . '][1],';
}
$vals = rtrim($vals,','); // remove last comma
$sql_stmt = '$stmt->bind_param("' . $types . '",' . $vals . ');'; // put bind_param line together
eval($sql_stmt); // execute bind_param
$stmt->execute();
$stmt->bind_result($col1,$col2,$col3,$col4,$col5,$col6); // this could probably also be done dynamically in the same way
while ($stmt->fetch()){
    printf("%s %s %s %s %s %s\n", $col1,$col2,$col3,$col4,$col5,$col6);
}






sqlbindparameter