0

mySQL DB では、ストアド プロシージャを使用して外部から DB を使用するための API を作成しました。

SQL インジェクションを防ぐために、このミッションのために、EXECUTE 権限のみを持つ特別なユーザーを指定しました。

ユーザー ID の接続のテーブルがあり、不明な数のパラメーターを含むプロシージャを作成する必要があります。プロシージャは、受信したすべての ID をテーブルに挿入する必要があります。

今のところ、私はmysqliでPHPを使用しており、自分でクエリを作成しています-これは非常に安全ではありません-そして、次のようになります:

/**
 * Add new rows to the invited users tables
 * @param $invitingUser string the inviting user facebook's Id
 * @param $invitedUsers array the invited users facebook's Id
 */
function addInvitedUsers($invitingUser, $invitedUsers)
{
    //check if all the parameters are set
    if (isset($invitingUser) && isset($invitedUsers))
    {
        //create the basic query for insert
        $query = "Insert Into Invited_Users (Inviting_id,Invited_Id) Values ";
        //for each invited users - add it to the query
        foreach($invitedUsers as $invitedUser)
            $query . "('$invitingUser','$invitedUser') ";

        if ($this->queryDb($query));
            echo "added new invited users";
    }
    //if parameters are not set - message
    else
        echo "parameters can't be null";
}

私は私に同じ能力を与える手順を作成したい..

配列または未定義の数のパラメーターをストアド プロシージャに送信できないことは知っていますが、セーフ モードで同じ機能を実行できる他の方法があると確信しています..

4

1 に答える 1

0

複数の値を MySql ストアド プロシージャに渡して使用する簡単な方法はありません。あなたの最善の策は、コンマで区切られた値の文字列を渡し、それを SP 内で分割することです。MySql はそのままではそのための手段を提供しません。

そうは言っても、実際に必要なのは準備されたステートメントだと思います。早いし安全です。

function addInvitedUsers($invitingUser, $invitedUsers)
{
    //check if all the parameters are set
    if (isset($invitingUser) && isset($invitedUsers))
    {
        // create a prepared statement for insert
        $query = "INSERT INTO Invited_Users (Inviting_id, Invited_Id) VALUES (?, ?)";
        $stmt = $this->prepare($query); // you need to implement prepare method in your class
        // bind parameters
        $stmt->bind_param("ii", $invitingUser, $invitedUser);
        //for each invited user execute insert
        foreach($invitedUsers as $invitedUser) {
            if ($stmt->execute()) {
                echo "added a new invited user";
            }
        }
    }
    //if parameters are not set - message
    else
        echo "parameters can't be null";
}

明らかに挿入をspにカプセル化し、準備されたステートメントを使用してそれを呼び出すことができます

CREATE PROCEDURE addInvitedUser(IN invitingUser INT, IN invitedUser INT)
  INSERT INTO Invited_Users (Inviting_id, Invited_Id) 
  VALUES (invitingUser, invitedUser);

そして、あなたの関数で変更するだけです

$query = "INSERT INTO Invited_Users (Inviting_id, Invited_Id) VALUES (?, ?)";

$query = "CALL addInvitedUser (?, ?)";
于 2013-07-20T20:54:19.317 に答える