函数内部的 PDO

问题描述 投票:0回答:4

我最近刚刚开始将数据库查询转换为 PDO。我在一个单独的文件中定义 $dsn、$opt 和 $pdo,该文件包含在我网站的每个页面中。然后,我在另一个显示页面的文件中进行简单的行计数查询,然后是另一个具有更高级查询的文件,该查询从多个表中提取各种信息。

一切顺利。

我还有其他包含特殊查询的内容,其中包括显示“面包屑”样式导航链接的查询。我将其转换为 PDO 所做的一切努力都失败了,我最好的猜测是问题与查询嵌套在函数内这一事实有关。

有人可以告诉我如何将其转换为 PDO 吗?

附注我应该解释一下,我使用变量 $TopnavName 和 $TopnavTable 是因为该文件由多个不同的网站和网站部分使用,每个网站都从不同的数据库表中绘制信息。


$TopnavName = 'URL';
$TopnavTable = ''.$mysiteid.'_topics'; // (= px_topics in this particular example)

function get_path($node, $TopnavTable, $TopnavName) {
$result = mysql_query('SELECT Parent FROM ' . $TopnavTable . ' WHERE ' . $TopnavName .   '="'.$node.'";');

 $row = mysql_fetch_array($result);
 $path = array();
 if ($row['Parent']!='') {
   $path[] = $row['Parent'];

$path = array_merge(get_path($row['Parent'], $TopnavTable, $TopnavName), $path);
}
 return $path;
}

 $mypath = get_path($MyURL, $TopnavTable, $TopnavName);
 $MyLink = $mypath;
 $MyDisplay = $mypath;
 $MyD1 = array('K-2/', '3-5/', '6-8/', '9-12/', '_');
 $MyD2 = array('', '', '', '', ' ');
 $MyDisplay = str_replace($MyD1, $MyD2, $MyDisplay);
 for($i=0;$i<count($mypath);$i++){
 $TopNav = "<a href=\"".$MyLink[$i]."\"> ".$MyDisplay[$i]."</a>&nbsp;&gt;";
 $That = array('<a href="Topics">', '"> ', '&gt;', '<a href="');
 $This = array('<a href="/Topics/">', '">', '&gt; ', '<a href="/Topics/');
 $TopNav = str_replace($That, $This, $TopNav);
 $TopNav = str_replace(''.$MyName.'/', '', $TopNav);
 echo $TopNav;
}
php pdo
4个回答
0
投票

如果 $pdo 是在函数外部定义的,那么它在函数内部将不可见。最好将其作为参数传递给您的函数,或者在函数内使用

将其标记为全局
global $pdo;

0
投票

我想类似的东西可以工作。

您必须声明数据库连接的全局

$db
句柄。

function get_path ($node)
{
    global $db;                        // reference to your PDO DB handle
    global $TopnavTable, $TopnavName;  // and the other globals

    $selector = $db->query(
        "SELECT Parent FROM $TopnavTable WHERE $TopnavName = \"$node\"";');
    $row = $selector->fetch (PDO::FETCH_ASSOC);

    $path = array();
    if ($row['Parent']!='')
    {
        $path[] = $row['Parent'];

        $path = array_merge (get_path($row['Parent']), $path);
    }
    return $path;
}

正如其他回复所建议的,您可能希望将这些全局变量包装到某些对象中,以获得更具可读性、紧凑且易于维护的代码。


0
投票

不要像其他人建议的那样使用全局,就代码的整洁而言,这确实不是一个好的计划。对于这种情况,正确的解决方案是为您的 pdo 数据创建一个带有静态变量的类。


0
投票

您应该将

$pdo
传递给函数。请注意,您不能绑定表或列名称

function get_path($pdo,$node,$TopnavTable, $TopnavName) {
    $stmt = $pdo->prepare("SELECT name FROM $TopnavTable WHERE  $TopnavName = ?");
    $stmt->bindValue(1,$node);
    $stmt->execute();
    $stmt->setFetchMode(PDO::FETCH_ASSOC);  
    $row = $stmt->fetch();  
    $path = array_merge(get_path($pdo,$row['Parent'], $TopnavTable, $TopnavName), $path);
    return  $path ;  
}

$pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password);  
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 
$mypath =  get_path($pdo,$node,$TopnavTable, $TopnavName);

我还没有测试函数的递归调用,因为我没有合适的测试表。

您可以查看this有关分层数据的文章中的检索单个路径,作为创建“面包屑”的更有效方法

© www.soinside.com 2019 - 2024. All rights reserved.