【问题标题】:PHP: Mysqli prepared statement with "select *"PHP:带有“select *”的Mysqli准备语句
【发布时间】:2015-06-01 07:10:18
【问题描述】:

这就是我目前从数据库中获取的方式:

if ($stmt = $mysqli->prepare ( "SELECT fname,lname from $table_name 
where cno >=? LIMIT 50" ))
    {
        $stmt->bind_param ( "i", $cno); 
        $stmt->execute ();
        $stmt->bind_result ($fname,$lname); 
        $arrayUsers = array();

        while ($stmt->fetch())
        {
            if (isset ($fname))
            {
                $arrayUsers[] = array(
                        "fname" => $fname,
                        "lname" => $lname);

}
}
$stmt->close ();
        }
        $mysqli->close ();

而且效果很好。 但是,如果我将选择更改为 SELECT * from... 我的绑定将失败。 这是否意味着如果我有大量字段,我仍然必须指定每个字段,还是有办法使用select *

----更新---

if (empty($arrayUsers))
    {
        return 0;
    }
    else
    {
        return $array;
    }

【问题讨论】:

  • 您也应该将$table_name 作为参数传递
  • 我写的,在函数参数里,我没有写在这里,因为它只是不必要地占用空间
  • 当您说绑定时,您指的是 bind_param 还是 bind_result? bind_result 需要为返回的每一列提供一个变量。确保它与列数匹配
  • 我的意思是如何使用select * 而不是select field1,field2
  • @JohnConde - 他不应该。 SELECT * FROM 'foo'SELECT * FROM foo 不同。

标签: php mysqli prepared-statement


【解决方案1】:

如果您需要选择所有列:

SELECT * FROM `table`

您将使用 PHP 的 get_result() 而不是 bind_result()

bind_result() 在您指定要检索的每一列时会更好,get_result() 将允许您从表中处理更通用的数据返回。

【讨论】:

  • 谢谢,杰!正是我想要的:)
【解决方案2】:

SELECT * 绝不是一个好主意。

最好是明确的。

如果您只有 2 列,它会起作用。

bind_result 就是这样工作的,数字变量需要匹配列。

除此之外,它需要在相同的顺序

编辑: pdo 中的示例:

if ($stmt = $pdo->prepare ("SELECT * from `$table_name` where cno >=:cno LIMIT 50" )){
    $stmt->execute([':cno'=>$cno]);
    $arrayUsers = $stmt->fetchAll();
    $stmt->close();
}
$pdo->close();

【讨论】:

  • 感谢您的回复!如果只有几列我不在乎,我有一些表超过 2 或 10,我只是好奇如何获得 select * 而不是显式调用每一列。不确定它是否可能......
  • 如果您事先知道要获取多少列并绑定所有变量,则可能。如果您添加或删除列,这很危险,您的代码会中断
  • 投票支持您的答案。我意识到select * 的陷阱,但我只是想知道如何做到/是否可以做到,杰回答了我的问题。再次感谢:)
  • @Ryan 是的,这就是您实现它所需要的,如果您不介意切换好运,PDO 也可以轻松完成
  • 谢谢!有 PDO 的示例吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 2015-03-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多