我刚刚开始将我的数据库查询转换为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> >";
$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;
}
答案 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数据提供静态变量的类。