2016-12-27 4 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 и $ переменных. – 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); 
} 

Только некоторые мысли с:

  • Не могли бы вы включить include_once вне своей функции, а не включать?
  • При возврате значения, прежде чем закрыть соединение, он никогда не будет свернут
+0

функция находится в классе, include должен находиться внутри функции –

Смежные вопросы