2016-10-15 5 views
-3

Я процедура, которая занимает несколько Params в качестве входных данных и дает выход одной переменнойКак передать несколько параметров хранимой процедуры, используя PDO в PHP

здесь я вставляемого мой код ниже.

Обновлено

$sqlStr = 'call sp_testproc(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);'; 
$c = new PDO("sqlsrv:Server=localhost;Database=testdb", "UserName", "Password"); 
$stmt = $c->prepare($sqlStr); 

$bindValues = array(
    'fields' => array(
     array('type' => 'input', 'name' => ':From', 'value' => '[email protected]', 'data_type' => PDO::PARAM_STR), 
     array('type' => 'input', 'name' => ':To', 'value' => '[email protected]', 'data_type' => PDO::PARAM_STR), 
     array('type' => 'input', 'name' => ':Cc', 'value' => '', 'data_type' => PDO::PARAM_STR), 
     array('type' => 'input', 'name' => ':Bcc', 'value' => '', 'data_type' => PDO::PARAM_STR), 
     array('type' => 'input', 'name' => ':Subject', 'value' => 'some value given', 'data_type' => PDO::PARAM_STR), 
     array('type' => 'input', 'name' => ':someId', 'value' => 10334, 'data_type' => PDO::PARAM_INT), 
     array('type' => 'input', 'name' => ':someId1', 'value' => 307560, 'data_type' => PDO::PARAM_INT), 
     array('type' => 'input', 'name' => ':ReadOrUnread', 'value' => 1, 'data_type' => PDO::PARAM_INT), 
     array('type' => 'input', 'name' => ':HasAttachments', 'value' => 1, 'data_type' => PDO::PARAM_INT), 
     array('type' => 'input', 'name' => ':someId2', 'value' => 9, 'data_type' => PDO::PARAM_INT), 
     array('type' => 'input', 'name' => ':someId3', 'value' => 89, 'data_type' => PDO::PARAM_INT), 
     array('type' => 'input', 'name' => ':link', 'value' => 'http:google.com', 'data_type' => PDO::PARAM_STR), 
     array('type' => 'input', 'name' => ':someId4', 'value' => 3998, 'data_type' => PDO::PARAM_STR), 
     array('type' => 'input', 'name' => ':MailDate', 'value' => '2014-02-01', 'data_type' => PDO::PARAM_STR), 
     array('type' => 'output', 'value' => '$Id', 'data_type' => PDO::PARAM_INPUT_OUTPUT), 
    ) 
); 

$proc_pass_val = null; 
if (isset($bindValues['fields']) && is_array($bindValues['fields'])) { 
    $arg_cnt = 1; 
    for ($i = 0; $i < count($bindValues['fields']); $i++) { 
     $bindValue = $bindValues['fields'][$i]["value"]; 
     $param_type = $bindValues['fields'][$i]["type"]; 
     $data_type = $bindValues['fields'][$i]["data_type"]; 

     if ($param_type == 'input') { 
      $stmt->bindValue($arg_cnt++, $bindValue, $data_type); 
     } elseif ($param_type == 'output') { 
      $stmt->bindParam($arg_cnt++, $proc_pass_val, $data_type); 
     } 
    } 
} 


$stmt->execute(); 

print "procedure returned $proc_pass_val\n"; 

Примечание: Я использую MSSQL сервер

Я хочу, чтобы выходной Procedure в переменной $ Id, пожалуйста, предложите мне, где я пошло не так

Спасибо in Advance

+0

'... используя знак вопроса заполнители, это будет 1-индексированную позицию параметр ... '[doc] (http://php.net/manual/en/pdostatement.bindvalue.php)' $ arg_cnt' не инициализирован, поэтому ставьте '$ arg_cnt = 1' перед циклом или используйте' ++ $ arg_cnt' – cske

+0

bindParam second arg shoud be '$$ bindValue' я думаю – cske

+0

Я хочу, чтобы переменная была в' $ Id', поэтому я проходил так, если бы я проходил strin g literal Я думаю, что это вызовет ошибку, которая не может пройти param 2 по ссылке –

ответ

-3

Я просто передал длину параметра до bindParam как этот

$stmt->bindParam($arg_cnt++, $proc_pass_val, $data_type, [Length of the data type]) 

и он работал на меня

код более читаемым в этом solution