2011-06-17 125 views
0

这可能是一个n00b的问题,但我不能为我的生活弄清楚我搞砸了什么。我以前有过类似的问题,但我认为我更多地修复了它而不是设计,我真的很想知道我实际上做了什么错误。神秘500错误

如果我在pastebin中运行代码,我得到一个500错误。但是,如果我将display_wine函数注释掉,它会非常好地运行。如果我运行调试器,它会突出显示关闭的php标签。我已经检查并进行了双重检查,以确保我没有任何其他的括号或分号。任何帮助将不胜感激!

<?php 

class simpleCMS { 

    var $host; 
    var $username; 
    var $password; 
    var $table; 
    var $id; 


    public function display_wine_list() { 
    $q = "SELECT * FROM whino ORDER BY created DESC LIMIT 3"; 
    $r = mysql_query($q); 

    if ($r !== false && mysql_num_rows($r) > 0) { 
     while ($a = mysql_fetch_assoc($r)) { 
     $id = $a['id']; 
     $name = stripslashes($a['name']); 
     $created = $a['created']; 
     $type = $a['type']; 

     /** 
     $evalt = "require_once '../generator/qrlib.php';"; 
     eval($evalt); 
     QRcode::png('http://qr.htbx.net/simplecms/mob_display.php?id='.$id, '../generator/temp/'.$id.'.png'); 
     **/ 

     $entry_display .= <<<ENTRY_DISPLAY 

    <div class="post"> 
     <h2> 
      $name 
     </h2> 
     <p>$created</p> 
     <p>$type</p> 

    </div> 

ENTRY_DISPLAY; 
     } 
    } else { 
     $entry_display = <<<ENTRY_DISPLAY 

    <h2> This Page Is Under Construction </h2> 
    <p> 
     No entries have been made on this page. 
     Please check back soon, or click the 
     link below to add an entry! 
    </p> 

ENTRY_DISPLAY; 
    } 
    $entry_display .= <<<ADMIN_OPTION 

    <p class="admin_link"> 
     <a href="{$_SERVER['PHP_SELF']}?admin=1">Add a New Entry</a> 
    </p> 

ADMIN_OPTION; 

    return $entry_display; 
    } 

    public function display_admin() { 
    return <<<ADMIN_FORM 

    <form action="{$_SERVER['PHP_SELF']}" method="post"> 

     <label for="name">Name:</label><br /> 
     <input name="name" id="name" type="text" maxlength="75" /> 
     <div class="clear"></div> 

     <label for="type">Type:</label><br /> 
     <input name="type" id="type" type="text" maxlength="100" /> 
     <div class="clear"></div> 

     <label for="notes">Notes:</label><br /> 
     <textarea name="notes" id="notes"></textarea> 
     <div class="clear"></div> 

     <input type="submit" value="Create This Entry!" /> 
    </form> 

    <br /> 

    <a href="display.php">Back to Home</a> 

ADMIN_FORM; 
    } 

    public function write($p) { 
    if ($_POST['name']) 
     $name = mysql_real_escape_string($_POST['name']); 
    if ($_POST['type']) 
     $type = mysql_real_escape_string($_POST['type']); 
    if ($_POST['grapes']) 
     $grapes = mysql_real_escape_string($_POST['grapes']); 
    if ($_POST['notes']) 
     $notes = mysql_real_escape_string($_POST['notes']); 
    if ($name && $type && $grapes && $notes) { 
     $created = date ("Y-m-d H:i:s", $phptime); 
     $sql = "INSERT INTO whino VALUES('','$name','$type','$grapes', '$notes')"; 
     return mysql_query($sql); 
    } else { 
     return false; 
    } 
} 

    public function connect() { 
    mysql_connect($this->host,$this->username,$this->password) or die("Could not connect. " . mysql_error()); 
    mysql_select_db($this->table) or die("Could not select database. " . mysql_error()); 

    return $this->buildDB(); 
    } 

    private function buildDB() { 
    $sql = <<<MySQL_QUERY 
CREATE TABLE IF NOT EXISTS whino (
id   INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
name  VARCHAR(75), 
notes  TEXT, 
created  DATE, 
type  VARCHAR(100), 
grapes  VARCHAR(75) 
) 
MySQL_QUERY; 

    return mysql_query($sql); 
    } 

public function display_wine($id) { 
    $q = "SELECT * FROM whino WHERE id = $id"; 
    $r = mysql_query($q); 

    if ($r !== false && mysql_num_rows($r) > 0) { 
     while ($a = mysql_fetch_assoc($r)) { 
      $id = $a['id']; 
     $name = stripslashes($a['name']); 
     $created = $a['created']; 
     $type = $a['type']; 

     $entry_display .= <<<ENTRY_DISPLAY 

      <div class="post"> 
       <h2> 
        $name 
       </h2> 
       <p>$created</p> 
       <p>$type</p> 

      </div> 

     ENTRY_DISPLAY; 
     } 
    } else { 
     $entry_display = <<<ENTRY_DISPLAY 

     <h2> This Page Is Under Construction </h2> 
     <p> 
     No entries have been made on this page. 
     Please check back soon, or click the 
     link below to add an entry! 
     </p> 

     ENTRY_DISPLAY; 
    } 
    $entry_display .= <<<ADMIN_OPTION 

    <p class="admin_link"> 
    <a href="{$_SERVER['PHP_SELF']}?admin=1">Edit</a> 
    </p> 

    ADMIN_OPTION; 

    return $entry_display; 
    } 


} 

?> 
+0

该代码没有声明一个类。你应该检查你的apache错误日志,以便进一步了解发生的错误。 – Alp

回答

3

您的HEREDOC syntax是不正确的。

$entry_display .= <<<ADMIN_OPTION 

    <p class="admin_link"> 
    <a href="{$_SERVER['PHP_SELF']}?admin=1">Edit</a> 
    </p> 

    ADMIN_OPTION; 

    return $entry_display; 

请参阅ADMIN_OPTION;线是怎么缩进? HEREDOC的必须在下一行的开头,因为这样的:

$entry_display .= <<<ADMIN_OPTION 

    <p class="admin_link"> 
    <a href="{$_SERVER['PHP_SELF']}?admin=1">Edit</a> 
    </p> 

ADMIN_OPTION; 

    return $entry_display; 
+0

修正HEREDOC后的证明:http://codepad.org/yktbQPVz –

+0

并修复HEREDOC之前:http://codepad.org/sn6mGsu4 –

+0

感谢您花时间解释它。这很明显,我没有真正理解HEREDOC语法,但我想我现在明白了。 –

0

这个问题似乎是你缩进关闭标签用于定界符分配。不管代码中发生了什么,ENTRY_DISPLAY;(等等)都需要一直留在第1列。

+0

我想这是一个愚蠢的问题,但这是非常有用的知道。谢谢! –

+0

@ sh1ps:不是一个愚蠢的问题(至少不是*第一次* :-)。当从命令行运行时,错误是'Parse error:syntax error,unexpected in $ end in test.php on line 182'。那么,这个文件只有* 181行,所以我立即知道这是某种失败的结束报价或某事。一个体面的语法着色编辑器可以用来捕捉这些类型的东西。 –