【问题标题】:GET syntax in xpathxpath 中的 GET 语法
【发布时间】:2010-12-27 23:47:06
【问题描述】:

我正在尝试使用在 xpath 查询中传递给页面的参数。这可以正常工作(硬编码):

<?php
$xml = simplexml_load_file("bookstore.xml");

$res = $xml->xpath("/bookstore/book[title = 'Everyday Italian']"); 

echo $res[0]->author

?>

但我通过参数传递:

bookdetails.php?title="Everyday Italian"

然后做:

<?php
$xml = simplexml_load_file("bookstore.xml");

$res = $xml->xpath("/bookstore/book[title = $_GET['title']]"); 

echo $res[0]->author

?>

我收到 500 错误。

有什么想法吗?

谢谢,

大卫

【问题讨论】:

    标签: php xml xpath


    【解决方案1】:

    尝试使用urlencode('bookdetails.php?title=Everyday Italian') 传递参数。

    【讨论】:

    • 我试过这个: echo "title) 。 ">" 。 $child->标题。 "
      ";但它也改变了?和 =,所以我想我想要这个: echo "title) 。 ">" 。 $child->标题。 "
      ";谢谢! (有没有办法在评论中发布代码??)
    • 要在 cmets 中发布代码或问题中的内联代码,您应该使用反引号 (`)。顺便说一句,如果这个答案是正确的,您可以考虑将其标记为已接受。
    【解决方案2】:

    PHP 变量将扩展为字符串值,在 XPATH 表达式中求值时应将其括在引号中。

    我对 PHP 不太熟悉,并且不确定嵌套引号(用于引用 $_GET 变量)在已经用单引号和双引号包裹时如何工作。

    我假设您可以通过连接字符串片段和变量来构建字符串:

    $res = $xml->xpath("/bookstore/book[title = '" . $_GET['title'] . "']"); 
    

    或者,您可以将值分配给可以不带引号引用的变量:

    <?php
    $xml = simplexml_load_file("bookstore.xml");
    $title = $_GET['title'];
    $res = $xml->xpath("/bookstore/book[title = '$title']"); 
    
    echo $res[0]->author
    
    ?>
    

    【讨论】:

    • 这些想法很棒。不幸的是,使用这两种方法我仍然会收到 500 个错误。 echo $_GET['title'] 显示正确的字符串,所以我不确定还有什么问题? (这里是链接:ewh.ieee.org/r1/schenectady/Sandbox/phpParameters/…
    • 嗯,你能回显错误的详细信息吗? XPATH 是正确的,应该选择book 元素。也许它没有正确加载 XML 文件?也许尝试指定完整路径(物理或 URL)?
    【解决方案3】:
    $res = $xml->xpath("/bookstore/book[title = $_GET['title']]");
    

    这是不正确的。在双引号字符串中插入数组/哈希元素时,不能引用索引值。以下任何一项都是正确的:

    $res = $xml->xpath("/bookstore/book[title = {$_GET['title']}]"); // surround with {}
    $res = $xml->xpath("/bookstore/book[title = $_GET[title]]"); // remove the '
    

    当然,当不在双引号字符串的上下文中时,那么做:

    $res = $_GET[title];
    

    将让 PHP 将“title”解释为一个常量,它很可能没有定义的值,因此代码将被解释为

    $res = $_GET[];
    

    【讨论】:

    • 嗯,也许我疯了 - 我认为它正在工作,但我现在又回到了 500 错误。 url 是:ewh.ieee.org/r1/schenectady/Sandbox/phpParameters/…,导致错误的行是:$res = $xml->xpath("/bookstore/book[title = $_GET[title]]");此行正常工作: echo $_GET['title'] 有什么想法吗?
    • 服务器日志中有任何内容吗? 500 是“内部服务器错误”,这意味着任何调试输出都将在服务器的错误日志中。
    • 不幸的是,我只能通过 ftp 访问此网络服务器。有没有办法“打开调试输出”,以便在浏览器中显示日志/错误或类似的东西?这 500 个错误真的让我很生气,因为我什至不知道从哪里开始寻找问题(因此我的问题在这里 :))。
    • 不幸的是,没有。这将是一个网络服务器设置。如果您的脚本在其下运行的用户 ID 可以访问日志目录(可能,但不太可能),您可能能够拼凑一个可以读出脚本最后几行的脚本。最好的办法是询问服务器操作员是否会为您的主机重定向错误日志,或者至少让您访问文件。
    • 另一个想法:您是否尝试过硬编码查询参数?我在“工作”示例中看到您在标题周围使用了单引号,但在非工作 _GET 版本中,它是双引号。尝试...[title = \"Everyday Italian\"]" 转义。也许该服务器上的 xpath 库已损坏并且不接受双引号字符串。
    猜你喜欢
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多