繁体   English   中英

我可以在PDO中使用哪个fetch_style,以便可以使用PHP extract()函数?

[英]Which fetch_style do I use with PDO, so I can use the PHP extract() function?

我有以下内容:

extract($this->model->findByStudentID(4));
print_r($this->model->findByStudentID(4));
echo "student id: " . $student_id;

extract()函数为我提供了int(0) print_r()给我:

Array ( [0] => Array ( [student_id] => 4 ......

当我尝试回显变量$ student_id时,我什么也没得到。 没有错误,没事。

$row($this->model->findByStudentID(4));
echo $row["student_id"];

以上为我提供了一个未定义的索引。

我的查询:

$sql = 'SELECT * FROM students WHERE student_id = :student_id';
        $this->adapter->prepare($sql);
        $place_holders = array(':student_id' => $_student_search);
        $this->adapter->execute($place_holders);
        $results = $this->adapter->fetchAll();

        foreach ($results as $student){
            echo "</br>" . $student["student_id"] . " , " . $student["LAST"] . "</br>";

        } //this works

        extract($results);
        echo $student_id . ' My student ID.';  //undefined variable

最后,这可行:

 echo $results[0]['student_id'] . ' THIS IS IT';

我每次都只带回一条记录,那么如何使extract()起作用,这样我就可以通过extract()函数简单地拥有$student_id

我怎样才能看到extract()做了什么?
如何引用提取的变量,我以为应该是$ student_id,$ last,$ first等。(我没有在请求变量中使用extract(),因此extract在这种情况下似乎是有效的。)

extract返回它提取的变量数。 因此,您无法直接看到它完成了什么。

出于这个原因,将其用于此目的将在稍后造成头痛,正是由于这个原因:您看不到它创建了哪些变量。 当您或其他人稍后返回该代码段时,您或他们将使用一些选择的诅咒词! 您最好使用PDO提取中的数组或对象选项。

就像@bad_boy在评论中说的那样,它更适合于将变量提取到模板范围内。


可以使用以下示例的一个常见的模板化示例来说明这一点:

ob_start();
extract($myDataForTheTemplate);
include('my-template.phtml');
$templateContents = ob_get_clean();

$myDataForTheTemplate数组的内容可用于下面包含的模板文件。

无需使用$myDataForTheTemplate['myValue'] ,模板就可以做到:

<p><?= $myValue ?></p>

请注意,这只是一个基本示例,演示了extract的常见用例。 在大多数情况下,这是不必要的,否则会使事情复杂化。

extract()需要一个关联数组。 您正在为其传递一个数字索引数组,因此由于未提取任何变量,它无法返回0 本质上,您要求它执行的操作是使用以下名称设置变量:

$0
$1
...
$n (index for your last row of data)

这些显然是无效的变量名。

正如其他人提到的那样,使用extract()通常是不好的做法,因为您正在污染全局名称空间,并且使用的是非直观的方式。 例如,如果数据库架构更改为添加新列,该怎么办。 您可能在全局范围内引入了一个新的变量名,而代码中没有任何内容向您显示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM