![](/img/trans.png)
[英]How do I specify the fetch_style when using a PDO prepared statement and the traversal interface?
[英]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.