2016-12-27 50 views
1

我正在寫一個函數,它接受三個參數,前兩個參數是字符串,但我想第三個參數組成多個參數。 下面是代碼多個參數作爲一個參數在php

function myFetch($query, $datatype, $variables){ 
     include("models.php"); 
     $stmt = $conn->prepare($query); 
     $stmt->bind_param($datatype, $variables); 
     $stmt->execute(); 
     $result = $stmt->get_result(); 
     return $result->fetch_assoc(); 

     $stmt->close(); 
     $conn->close(); 
} 

從上面的代碼塊,我想的第三個參數$variable包含其它參數,例如$variable = $one, $two, $three, $four其中這些參數有自己的數據要傳遞給所述bind_param功能。

$query$datatype$variables實施例:
$query = "SELECT * FROM table WHERE id = ? and visible = ?";
$datatype = "ii";
$id = 1,$visible = 1;
$variables = $id, $visible;

+1

你想'$ variables'是一個數組* *? – David

+0

如果它在'bind_param'工作,爲什麼不呢? –

+0

請發佈$ query,$ datatype和$ variables的示例。 – Oliver

回答

2

解決辦法是這樣的:

  • 創建一個空$param陣列和遍歷你的論點變量數組$variables使用for循環。
  • 在循環的每次迭代中,將元素推送到$variables數組作爲參考。
  • 使用array_unshift()函數將$datatype推到$variables數組的開頭。
  • 最後,使用call_user_func_array()函數來綁定每個參數。

所以你myFetch()功能應該是這樣的:

function myFetch($query, $datatype, $variables){ 
    include("models.php"); 
    $stmt = $conn->prepare($query); 
    $param = array(); 
    $count = count($variables); 
    for($i = 0; $i < $count; ++$i){ 
     $param[] = &$variables[$i]; 
    } 
    array_unshift($param, $datatype); 
    call_user_func_array(array($stmt, 'bind_param'), $param); 
    $stmt->execute(); 
    $result = $stmt->get_result(); 
    $stmt->close(); 
    $conn->close(); 

    return $result; 
} 

隨後,你可以調用這個函數是這樣的:

$query = "SELECT * FROM table WHERE id = ? and visible = ?"; 
$datatype = "ii"; 
$variables = array(1, 1); 

$result = myFetch($query, $datatype, $variables); 
while($row = $result->fetch_assoc()){ 
    // display $row details 
} 
1

使用Reflection調用mysqli::bind_param(),實施例:

<?php 
$resource = $db->prepare("SELECT * FROM table WHERE id = ? and visible = ?"); 
$reflectionArray = array(1,"yes"); 
$reflection = new ReflectionClass('mysqli_stmt'); 
$method = $reflection->getMethod("bind_param"); 
$method->invokeArgs($resource, $reflectionArray); 
$resource->execute(); 
?> 

您的功能:

function myFetch($query, $datatype, $variablesArray){ 
    include("models.php"); 
    $stmt = $conn->prepare($query); 

    $reflection = new ReflectionClass('mysqli_stmt'); 
    $method = $reflection->getMethod("bind_param"); 
    $method->invokeArgs($stmt, $variablesArray); 
    $resource->execute(); 

    $result = $stmt->get_result(); 

    $stmt->close(); 
    $conn->close(); 

    return $result->fetch_assoc(); 
} 
+0

你能寫一個在上面的修改函數中傳遞參數的例子嗎? –

+0

它的一個簡單的數組:'myFetch(「select ....」,「ii」,[parameter1,parameter2 ...])' –

2

這應該做你在你的函數想要的一切:

$query = "SELECT * FROM table WHERE id = ? and visible = ?"; 
$variables = array($id, $visible); 
function myFetch($query, $variables){ 
     include("models.php"); 
     $stmt = $conn->prepare($query); 
     $stmt->execute($variables); 
     $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
} 

只是有些想法s:

  • 你可以在函數外部使用include_once而不是include?
  • 當您關閉連接之前返回一個值,它永遠不會關閉
+0

函數在一個類中,include必須在函數內部 –