第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

mysqli bind_param用于字符串?dāng)?shù)組

mysqli bind_param用于字符串?dāng)?shù)組

忽然笑 2019-11-20 14:24:58
我無法使它正常工作。我現(xiàn)在花了很多時(shí)間在上面。這有效:$mysqli = new mysqli("localhost", "root", "root", "db");if(!$mysqli || $mysqli->connect_errno){    return;}$query_str= "SELECT name FROM table WHERE city IN ('Nashville','Knoxville')";$query_prepared = $mysqli->stmt_init();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();我究竟做錯(cuò)了什么?我也嘗試過call_user_func_array,但似乎無法正確獲取語法。編輯:我已經(jīng)嚴(yán)格嘗試過moskito-x的建議和此處列出的大量示例,以及在SO和隨機(jī)網(wǎng)站上的其他示例,沒有任何效果。我認(rèn)為問題可能出在PHP 5.4上,這就是我的MAMP現(xiàn)在設(shè)置的
查看完整描述

3 回答

?
大話西游666

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超14個(gè)贊

您不能將兩個(gè)變量綁定為一個(gè)question mark!


對(duì)于您綁定的每個(gè)變量,您都需要一個(gè) question mark


“ bind_param”檢查每個(gè)變量是否符合要求。之后,將字符串值放在引號(hào)之間。


這是行不通的。


"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一對(duì)一地引用字符串參數(shù)。

并且變量的數(shù)量和字符串類型的長度必須與語句中的參數(shù)匹配。


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

會(huì)變成


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

現(xiàn)在bind_param必須


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

有了這個(gè)


$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')";

這就是為什么數(shù)組不起作用的原因。

解決這個(gè)問題的唯一方法是call_user_func_array


如果您初始化一條語句,則不需要進(jìn)行以下操作


$query_prepared = $mysqli->stmt_init();

if($query_prepared && $query_prepared->prepare($query_str)) {

這是對(duì)的


$query_prepared = $mysqli->stmt_init();

if($query_prepared->prepare($query_str)) {

如果您不想使用call_user_func_array

并且只有少量參數(shù)

,則可以使用以下代碼來實(shí)現(xiàn)。


[...]

$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。


尋找mysqli-stmt.bind-param的解決方案nick9v


查看完整回答
反對(duì) 回復(fù) 2019-11-20
?
肥皂起泡泡

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個(gè)贊

像這樣使用call_user_func_array:


$stmt = $mysqli->prepare("INSERT INTO t_file_result VALUES(?,?,?,?)");


$id = '1111';

$type = 2;

$result = 1;

$path = '/root';


$param = array('siis', &$id, &$type, &$result, &$path);

call_user_func_array(array($stmt, 'bind_param'), $param);


$stmt->execute();


printf("%d row inserted. \n", $stmt->effected_rows);

$stmt->close;


查看完整回答
反對(duì) 回復(fù) 2019-11-20
?
嚕嚕噠

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超7個(gè)贊

通常情況下,這個(gè)問題太老了,無法提供遠(yuǎn)程可靠的解決方案,但Google仍將訪客發(fā)送到這里。所以這是2019年及以后的答案。


我將從Mysqli準(zhǔn)備的語句中為IN子句添加多個(gè)值的方式進(jìn)行解釋:


首先,我們需要?jiǎng)?chuàng)建一個(gè)字符串,該字符串的?標(biāo)記與數(shù)組中元素的數(shù)量一樣多。為此,我們將使用str_repeat()為此目的非常方便的功能。

然后,必須將帶有逗號(hào)分隔的問號(hào)的字符串添加到查詢中。盡管它是一個(gè)變量,但在這種情況下它是安全的,因?yàn)樗鼉H包含常量值

那么該查詢必須像其他任何查詢一樣準(zhǔn)備

那么我們將需要?jiǎng)?chuàng)建一個(gè)字符串,其類型將與bind_param()一起使用。注意,通常沒有理由對(duì)綁定變量使用不同的類型-mysql會(huì)很樂意接受它們?nèi)孔鳛樽址S羞呺H案例,但極為罕見。對(duì)于日常使用,您可以始終保持簡單,并在所有內(nèi)容中使用“ s”。str_repeat()再次救援。

那么我們需要將數(shù)組值綁定到該語句。不幸的是,您不能僅將其寫為單個(gè)變量,像這樣$stmt->bind_param("s", $array),只能使用標(biāo)量變量bind_param()。幸運(yùn)的是,有一個(gè)參數(shù)解包運(yùn)算符可以完全滿足我們的需要-將值數(shù)組發(fā)送到函數(shù)中,就好像它是一組不同的變量一樣!

其余的與往常一樣-執(zhí)行查詢,獲取結(jié)果并獲取數(shù)據(jù)!

所以正確的示例代碼是


$array = ['Nashville','Knoxville']; // our array

$in    = str_repeat('?,', count($array) - 1) . '?'; // placeholders

$sql   = "SELECT name FROM table WHERE city IN ($in)"; 

$stmt  = $mysqli->prepare($sql);

$types = str_repeat('s', count($array)); 

$stmt->bind_param($types, ...$array); // bind array at once

$stmt->execute();

$result = $stmt->get_result(); // get the mysqli result

$data = $result->fetch_all(MYSQLI_ASSOC); // fetch the data   

盡管此代碼很大,但與迄今為止在本主題中提供的任何其他合理的解決方案相比,它是無與倫比的。


查看完整回答
反對(duì) 回復(fù) 2019-11-20
  • 3 回答
  • 0 關(guān)注
  • 815 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)