我最近刚刚开始将数据库查询转换为 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> >";
$That = array('<a href="Topics">', '"> ', '>', '<a href="');
$This = array('<a href="/Topics/">', '">', '> ', '<a href="/Topics/');
$TopNav = str_replace($That, $This, $TopNav);
$TopNav = str_replace(''.$MyName.'/', '', $TopNav);
echo $TopNav;
}
如果 $pdo 是在函数外部定义的,那么它在函数内部将不可见。最好将其作为参数传递给您的函数,或者在函数内使用
将其标记为全局global $pdo;
我想类似的东西可以工作。
您必须声明数据库连接的全局
$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;
}
正如其他回复所建议的,您可能希望将这些全局变量包装到某些对象中,以获得更具可读性、紧凑且易于维护的代码。
不要像其他人建议的那样使用全局,就代码的整洁而言,这确实不是一个好的计划。对于这种情况,正确的解决方案是为您的 pdo 数据创建一个带有静态变量的类。
您应该将
$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有关分层数据的文章中的检索单个路径,作为创建“面包屑”的更有效方法