PHP:带有“select *”的Mysqli准备语句

Posted

技术标签:

【中文标题】PHP:带有“select *”的Mysqli准备语句【英文标题】:PHP: Mysqli prepared statement with "select *" 【发布时间】: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 不同。 【参考方案1】:

如果您需要选择所有列:

SELECT * FROM `table`

您将使用 phpget_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 的示例吗?

以上是关于PHP:带有“select *”的Mysqli准备语句的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mysqli 中为带有 IN 的 SELECT 提供参数

带有通配符的 MySQLi 准备语句的奇怪结果(程序)

mysqli入门(php)

bind_result 成数组 PHP mysqli 准备好的语句

mysqli 使用 select * 和准备好的语句和查询

从 mysql_query 转换为准备好的语句 (mysqli/PDO)?必要的?