【问题标题】:Array instead of a single item in PHP数组而不是 PHP 中的单个项目
【发布时间】:2017-02-23 23:17:31
【问题描述】:

这给了我一个包含两个项目的数组,尽管查询输出应该是一个单元格,这可能很明显,但对于像我这样的初学者来说不是

$db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options); 
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); 

function dbFetch($db,$query)
    {
        $stmt = $db->prepare($query); 
        $stmt->execute(); 
        return $stmt->fetch();
    }

$query = " 
SELECT
Name
FROM Players WHERE PlayerID='21'"; 
$rows = dbFetch($db,$query);
var_dump($rows);

输出:

array(2) { ["Name"]=> string(6) "PLAYERNAME" [0]=> string(6) "PLAYERNAME" } 

它首先作为关联重复输出,然后作为数字重复输出。

【问题讨论】:

  • 你得到了一个关联索引和一个数字索引。只需使用$stmt->fetch(PDO::FETCH_ASSOC);

标签: php mysql pdo fetch


【解决方案1】:

尝试改用PDOStatement::fetchColumn()。它将返回第一条记录的第一列。

function dbFetch($db,$query)
{
    $stmt = $db->prepare($query); 
    $stmt->execute(); 
    return $stmt->fetchColumn(0);
}

另外,我敢打赌,您搜索的不是“21”,而是一个变量。在这种情况下,您最好使用prepared statements,并像这样修改您的代码:

$db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options); 
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); 
function dbFetch($db,$query,$params=[])
{
    $stmt = $db->prepare($query); 
    $stmt->execute($params); 
    return $stmt->fetch();
}

$query = " 
SELECT
Name
FROM Players WHERE PlayerID=?";
$params = array("your user id"); 
$rows = dbFetch($db,$query,$params);
var_dump($rows);

【讨论】:

  • 您能否深入了解它为什么会创建两个项目?
  • @denski the default fetch_style 是获取数字和关联。 PDO::FETCH_BOTH
  • 嘿,我正在使用准备好的语句,只是想让它尽可能轻松。非常感谢。
  • 所以在函数$params=[ ] 中,如果$params 没有值,则默认[ ]?酷!
【解决方案2】:

可能是由于 fetch 样式。

根据php手册:

公共混合 PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] ) 从与 PDOStatement 关联的结果集中获取一行 目的。 fetch_style 参数决定了 PDO 如何返回行。

fetch_style 控制如何将下一行返回给调用者。 该值必须是 PDO::FETCH_* 常量之一,默认为 PDO::ATTR_DEFAULT_FETCH_MODE 的值(默认为 PDO::FETCH_BOTH)。

PDO::FETCH_ASSOC:返回一个按列名索引的数组作为返回 在你的结果集中

PDO::FETCH_BOTH(默认):返回由两列索引的数组 结果集中返回的名称和索引为 0 的列号

PDO::FETCH_BOUND:返回 TRUE 并分配列的值 在您的结果集中与它们绑定的 PHP 变量 PDOStatement::bindColumn() 方法

PDO::FETCH_CLASS:返回请求类的新实例, 将结果集的列映射到 类,然后调用构造函数,除非 还给出了 PDO::FETCH_PROPS_LATE。如果 fetch_style 包括 PDO::FETCH_CLASSTYPE(例如 PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE) 然后类的名称由第一个值确定 列。

PDO::FETCH_INTO:更新所请求类的现有实例, 将结果集的列映射到类中的命名属性

PDO::FETCH_LAZY:结合 PDO::FETCH_BOTH 和 PDO::FETCH_OBJ,创建 对象变量名,因为它们被访问

PDO::FETCH_NAMED:返回一个形式相同的数组 PDO::FETCH_ASSOC,除非有多个列带有 同名,该键引用的值将是一个数组 具有该列名称的行中的值

PDO::FETCH_NUM:返回一个由列号索引的数组作为返回 在您的结果集中,从第 0 列开始

PDO::FETCH_OBJ:返回一个匿名对象,其属性名称 对应于结果集中返回的列名

PDO::FETCH_PROPS_LATE:当与 PDO::FETCH_CLASS 一起使用时, 在分配属性之前调用类的构造函数 从各自的列值。

【讨论】:

    猜你喜欢
    • 2013-11-20
    • 2021-09-28
    • 2020-06-10
    • 2021-02-17
    • 2013-08-09
    • 2021-11-03
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多