SQL预编译语句 - 如何选择多行

时间:2014-05-25 12:09:42

标签: php sql mysqli prepared-statement

到目前为止我有这个代码

// Starts the transaction
self::$database->startTransaction();
    try {

        $sql  = "SELECT playerId FROM players WHERE name=?";
        $stmt = self::getConnection()->prepare($sql);
        $stmt->bind_param('s', $playerName);
        foreach ($playerNames as $key => $playerName) {
            $stmt->execute();
            $stmt->bind_result($playerId);
            $stmt->fetch();
            echo $playerId . "<br>";
        }

        // commits the transaction
        self::$database->commit();
    } catch (Exception $e) {
        self::$database->rollback();
        throw new Exception(__METHOD__." | ".$e->getMessage());
    }

数组$playerNames包含玩家的名字,例如

array('Player1', 'Player2', 'player3')

上面的代码应该从数据库中选择那些玩家的playerId。我有一些问题:

  1. 它只返回最后 playerId(在本例中为'player3'的Id)。我不知道为什么。

  2. 我使用foreach - 循环到execute()。如果数组中有数百个名称,这对性能有害吗?

  3. 在generell中:这是SELECTINSERT来自或进入数据库的东西的正确方法吗?

  4. 我读到了这个问题:How can I prevent SQL injection in PHP?

    但由于这个原因,它并没有真正起作用:

    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
        // do something with $row
    }
    

    我的getResult() - 方法出错了。它说,该方法不存在。我认为我的网站空间不支持它,我无法手动安装它。所以我需要坚持fetch()

    或者它可能有其他原因吗?

1 个答案:

答案 0 :(得分:2)

    $sql  = "SELECT playerId FROM players WHERE name=?";
    $stmt = self::getConnection()->prepare($sql);
    $stmt->bind_param('s', $playerName);
    $stmt->bind_result($playerId);
    foreach ($playerNames as $key => $playerName) {
        $stmt->execute();
        $stmt->fetch();
        echo $playerId . "<br>";
    }
  1. 您只获取上次执行的结果
  2. 运行长循环显然对性能不利。尽量避免它们。
  3. 是的,总的来说。