【问题标题】:Values from mysql php array not being displayed未显示来自 mysql php 数组的值
【发布时间】:2013-11-30 21:36:04
【问题描述】:

这可能很简单,如果这是一个愚蠢的问题,我提前道歉。

我在一个网页上工作,我有一个数据库,我从中调用数据大部分工作正常,但是我需要使用 mysql 查询,而不仅仅是选择所有或特定字段:

$sqlAuthors = ('SELECT authors.Forename, authors.Surname
                         FROM authors
                         LEFT JOIN BookAuthor ON  authors.AuthorID = BookAuthor.AuthorID
                         LEFT JOIN Books ON  BookAuthor.BookID = Books.BookID
                         WHERE Books.BookID="'.$loopnumber.'"');

我已经在数据库上测试过这个查询并且工作正常,查询将有多个记录。

我的代码是:

$conn = mysql_connect('localhost', 'root', '');
        mysql_select_db('library', $conn);
        $sql = "SELECT * FROM Books";
        $result = mysql_query($sql, $conn) or die("Can't run query");
        $loopnumber = 1;                            
        if (mysql_num_rows($result) ==0 ){echo "No Books have been found";}
        else
        {
            while ($row = mysql_fetch_object($result)) 
            {
                $sqlAuthors = ('SELECT authors.Forename, authors.Surname
                         FROM authors
                         LEFT JOIN BookAuthor ON  authors.AuthorID = BookAuthor.AuthorID
                         LEFT JOIN Books ON  BookAuthor.BookID = Books.BookID
                         WHERE Books.BookID="'.$loopnumber.'"');
                $Authors  = mysql_query($sqlAuthors,$conn);

                echo'<article class="topContent">
                    <header><h2><a href="../ResponsiveCSS/first post">'.$row->BookName.'</a></h2></header>                   
                    <footer><p class="post-info">Written By: '.print_r(mysql_fetch_array($Authors)).' '.$Authors[Forename].'</p></footer>

最后一行是我尝试输出值的地方。

但是,如果我有 $Authors[Forename] 它会给我错误:

Notice: Use of undefined constant Forename - assumed 'Forename' in I:\xamptest\htdocs\Library\index.php on line 51

即使我有:

print_r(mysql_fetch_array($Authors))

并且有效并输出:

Array ( [0] => J.R.R [Forename] => J.R.R [1] => Tolkien [Surname] => Tolkien )

所以它应该识别它,而且打印出来的数组也没有出现在它应该在的行附近,甚至不是同一个 DIV,但它应该在哪里只有“1”回显。

如果我尝试:

'.$Authors[1].'

然后我没有收到任何错误,但没有打印出来。

不知道它是否会有所帮助,但网站页面的部分如下所示:http://i.imgur.com/mMEQke5.png

应该在写着“作者:”的地方打印作者姓名,但只有“1”。

我对此还是很陌生,但它让我难过。

非常感谢所有帮助 -Tom

【问题讨论】:

  • 您在 while 循环中使用了 mysql_fetch_object;所以你将结果作为一个对象而不是一个数组来获取;但mysql_fetch_array 给你的作者 - 尽量保持一致
  • 但是您在作者 SQL 查询中注入了任意数字 $loopnumber - 它与书籍没有任何关系,那么您实际上想做什么?由于您的作者查询使用连接,您为什么不加入您的图书查询?
  • 书籍可以有多个作者,作者可以写多本书,我有一个连接表来摆脱这种多对多的关系。还说明了查询有效,很好,我什至向您展示了数组输出值,所以我不明白您在说什么。请保持建设性,而不是批评已证明有效的方法。
  • 至于不一致,是的,也许我应该使用 fetch 对象,但这并不能解决为什么我所拥有的东西不起作用。 loopnumber 也不是任意的,因为页面输出数据库中的所有书籍,其 ID 从 1 开始......一分钱掉了吗?我什至再次用值显示整个数组的输出,但你说我的 WHERE 子句中有一个不相关的值......
  • 啊,是的,请原谅我的愚蠢;您的数据库保证只有连续的书籍 ID 号,并且永远不会有任何间隙;因此,您可以简单地创建一个额外的变量来使用,而不是使用实际的图书 ID.... 除非您使用单个连接查询完成所有这些操作,这会让您的生活变得更轻松

标签: php mysql sql arrays


【解决方案1】:

您的大量代码需要清理,但我们可以在解决手头的问题后专注于此。

$Authors  = mysql_query($sqlAuthors,$conn);

从查询中返回一个结果集,没有问题(除了不推荐使用 mysql_query(),但我们可以稍后再谈 :)

现在,让我们假设一本书可能有多个作者,就像许多参考文本中的情况一样,因为您已经在循环访问所有要返回的书籍。让我们继续,将我们的新结果集放入与您已经完成的类似的循环中:

while($author_row = mysql_fetch_array($Authors)){
    echo $author_row['Forename'];
}

上面的代码完全不完整,但希望它是您需要做的事情的起点。

请注意几点:mysql_*() 已被弃用,因此请尽快切换到使用 mysqli API!如果你不这样做,人们会在这里开始对你大喊大叫;)

确保您在清理后使用准备好的语句以确保安全。如果操作正确,很容易防范,但 sql 注入很讨厌。

【讨论】:

  • 非常感谢,我已经通过切换到 fetch_object 而不是数组来让它工作,但还没有弄清楚循环,我现在有:&lt;footer&gt;&lt;p class="post-info"&gt;Written By: ';while ($Authors = mysql_fetch_object($Aresult)){echo $Authors-&gt;Forename.' '.$Authors-&gt;Surname.', ';}echo'First Release Date: '.$row-&gt;PublishDate.'&lt;/p&gt;&lt;/footer&gt; 我不知道是什么mysql API 是,所以最好查一下! :) 再次感谢。
  • 很高兴这对你有用!只要保持一致,就可以省去很多麻烦 :) 关于 mysqli,它与使用 mysql api 并没有太大的不同。理想情况下,您可以使用与 DBMS 无关的库或框架,但我离题了。如果您还没有找到这些文档,请查看以下文档:us3.php.net/mysqli 实际上,当涉及到旧的 mysql api 时,您会发现它实际上相当强大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
  • 1970-01-01
相关资源
最近更新 更多