功能中的PDO

时间:2014-01-05 04:41:15

标签: pdo

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

一切都在努力。

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

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

P.S。我应该解释一下,我使用变量$ 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;
}

4 个答案:

答案 0 :(得分:1)

你应该将你的$pdo传递给function.Note你不能绑定表名或列名

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有关分层数据的文章中查看检索单一路径,作为创建“面包屑”的更有效方式

答案 1 :(得分:0)

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

将其标记为函数内的全局函数
global $pdo;

答案 2 :(得分: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;
}

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

答案 3 :(得分:0)

不要像其他人所暗示的那样使用全局,就代码的清洁度而言,它确实不是一个好的计划。对于这种情况,正确的解决方案是为您的pdo数据提供静态变量的类。