0

在我的 mySQL 数据库中,我创建了一个 API,用于使用存储过程从外部使用数据库。

我为这个任务设置了一个只有 EXECUTE 权限的特殊用户 - 以防止 SQL 注入。

我有一个用户 id 连接表,我需要创建一个包含未知数量参数的过程 - 该过程应该将他收到的所有 id 插入表中。

现在我将 PHP 与 mysqli 一起使用,我正在创建我自己的查询 - 这是非常不安全的 - 它看起来像这样:

/**
 * 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 回答