簡體   English   中英

在 PHP 中執行多個查詢,並將 NULL 作為輸入參數

[英]Execute Multiple Queries in PHP with NULL as an Input Parameter

編輯 (2011-07-23)

得到了一些非常有用的答案,我都嘗試過實施。 但我似乎無法從我的Get_Security語句中取回 id。 我很確定我的問題是,在我的第一個調用語句Get_Security中,最后三個參數設置為NULL 似乎其他人也有同樣的問題。 似乎沒有太多關於將 NULL 作為輸入的文檔。 一個 go 怎么處理這個?

新代碼

$stmt = mysqli_stmt_init($link);
$sql = "CALL Get_Security('$symbol', '$tagName', NULL, NULL, NULL)";
if (!mysqli_stmt_prepare($stmt, $sql)){
    $error = 'Failed to prepare statement. Error No: ' . mysqli_errno($link) . ': ' . mysqli_error($link);
    include '../error.html.php';
    exit();
}
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($result)) {
    $id = $row['id'];
}
mysqli_stmt_close($stmt);
mysqli_close($link);

include $_SERVER['DOCUMENT_ROOT'] . 'mypath-to-database-link';  //this gets $link
$stmt = mysqli_stmt_init($link);
$sql = "CALL Add_Active('$id','Research')";
if (!mysqli_stmt_prepare($stmt, $sql)){
    $error = 'Failed to prepare statement Add_Active. Error No: ' . mysqli_errno($link) . ': ' . mysqli_error($link);
    include '../error.html.php';
    exit();
}
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
mysqli_close($link);

include $_SERVER['DOCUMENT_ROOT'] . 'mypath-to-database-link'; //this gets $link
$sql = "INSERT INTO MyTable SET
        id='$id',
        open_items='$openItems',
        attachments='$attachments'
    ";
$stmt = mysqli_stmt_init($link);
if (!mysqli_stmt_prepare($stmt, $sql)){
    $error = 'Failed to INSERT INTO Research_Security. Error No: ' . mysqli_errno($link) . ': ' . mysqli_error($link);
    include '../error.html.php';
    exit();
}
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
mysqli_close($link);

原始條目

廣泛搜索(例如 PHP 手冊,SO 問題),但答案令人困惑。

我需要連續執行 3 條 SQL 語句:

  1. 調用存儲過程Get_Security ,它接受一些輸入並返回一個數組,包括 id。

  2. 調用另一個存儲過程Add_Active ,它將Get_Security返回的 id 作為輸入。

  3. 在我的表中插入一些變量。

問題:我收到 MySQL 錯誤號 2014:“命令不同步;您現在無法運行此命令”。

我知道我必須使用mysqli_stmt_preparemysqli_stmt_executemysqli_stmt_close來解決這個問題,但是如何做到這一點非常令人困惑。

非常感謝有關如何使用上述功能進行翻譯的幫助。

代碼:

$sql = "CALL Get_Security('$symbol', '$tagName', NULL, NULL, NULL)";   
$result = mysqli_query($link, $sql);
if (!$result){
        $error = 'Error calling stored procedure Get_Security.';
        include '../error.html.php';
        exit();
}
while($row = mysqli_fetch_array($result)){
    $tags[] = array('id' => $row['id']);
}
foreach ($tags as $tag){
    $id = $tag['id'];
}


$sql = "CALL Add_Active('$id','Research')";
$result = mysqli_query($link, $sql);
if (!$result){
        $error = 'Error calling stored procedure Add_Active. Error No: ' . mysqli_errno($link) . ': ' . mysqli_error($link);
        include '../error.html.php';
        exit();
}

$sql = "INSERT INTO MyTable SET
            id='$id',
            open_items='$openItems',
            attachments='$attachments'
        ";
if (!mysqli_query($link, $sql)){
        $error = 'Error adding submitted tag into Research_Security. Error No: ' . mysqli_errno($link) . ': ' . mysqli_error($link);
        include '../error.html.php';
        exit();
}

我希望這有幫助。 據我所知,你並沒有做任何太花哨的事情,所以這就足夠了。 PDO 也支持存儲過程的 IN/OUT 參數,但我沒有看到你使用它們。

請注意,PDO 以不同的方式處理錯誤,具體取決於它的初始化方式。 所以我在這里跳過了錯誤處理。 如果您有任何問題,請告訴我。

另請注意,在您添加 DSN(例如MySQL )之前,此代碼並不關心它是什么數據庫類型,因此 DSN 可以是一個配置值,使您的代碼更具可移植性。 我相信您還可以看到如何輕松將此代碼擴展為類/模型結構(特別是安全檢查 SP 可以成為 PHP 方法)

$db = new PDO(); // http://www.php.net/manual/en/pdo.construct.php for params

// These generate PDO_Statement (see: http://www.php.net/manual/en/class.pdostatement.php)
$securityStmt = $db->prepare("CALL Get_Security( ?, ?, ?, ?, ? )");
$addActiveStmt = $db->prepare("CALL Add_Active( ?, ? )");
$insertStmt = $db->prepare("INSERT INTO MyTable SET id=?, open_items=?, attachments=?");

// Security CALL
$securityStmt->bindParam( 1, $symbol, PDO::PARAM_STR );
$securityStmt->bindParam( 2, $tagName, PDO::PARAM_STR );
$securityStmt->bindParam( 3, NULL, PDO::PARAM_NULL );
$securityStmt->bindParam( 4, NULL, PDO::PARAM_NULL );
$securityStmt->bindParam( 5, NULL, PDO::PARAM_NULL );

$securityStmt->execute();

// Bind the ID to a variable is useful sometimes...
$securityStmt->bindColumn( 'id', $securityId );
$securityStmt->fetch( PDO::FETCH_BOUND );

/*
    Insert + Active call
    These are much simpler because we don't need to set the data types of the input
    (they are all string I hope...you didn't mention what the last 2 were in the insert).
*/

$addActiveStmt->execute(
    array(
        $securityId,
        'Wedge Research'
    )
);

$insertStmt->execute(
    array(
        $securityId,
        $openItems,
        $attachments
    )
);
$stmt = mysqli_stmt_init($link);
mysqli_stmt_prepare($stmt, "CALL SOMETHING()");
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($result)) {
    print_r($row);
}
mysqli_stmt_close($stmt);

所以我想出了如何用我的原始代碼解決這個問題,只需在每次查詢后關閉到數據庫的鏈接。 我很樂意做准備好的陳述,但至少這是可行的。

include $_SERVER['DOCUMENT_ROOT'] . 'path-to-connecting-to-db'; //get $link here    
$sql = "CALL Get_Security('$symbol', '$tagName', NULL, NULL, NULL)"; 


$result = mysqli_query($link, $sql);
if (!$result){
        $error = 'Error calling stored procedure Get_Security.';
        include '../error.html.php';
        exit();
}
while($row = mysqli_fetch_array($result)){
    $tags[] = array('id' => $row['id']);
}
foreach ($tags as $tag){
    $id = $tag['id'];
}
mysqli_close($link);
include $_SERVER['DOCUMENT_ROOT'] . 'path-to-connecting-to-db'; //get $link here
$sql = "CALL Add_Active('$id','Research')";
$result = mysqli_query($link, $sql);
if (!$result){
        $error = 'Error calling stored procedure Add_Active. Error No: ' . mysqli_errno($link) . ': ' . mysqli_error($link);
        include '../error.html.php';
        exit();
}
mysqli_close($link);
 include $_SERVER['DOCUMENT_ROOT'] . 'path-to-connecting-to-db'; //get $link here
$sql = "INSERT INTO myTable SET
            id='$id',
            open_items='$openItems',
            attachments='$attachments'
        ";
if (!mysqli_query($link, $sql)){
        $error = 'Error adding submitted tag into Research_Security. Error No: ' . mysqli_errno($link) . ': ' . mysqli_error($link);
        include '../error.html.php';
        exit();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM