2012-10-31 114 views
1

我有一個PHP腳本如下:未定義連接可變

function addPost(BlogPost $item, $tags) { 
     $connection = mysql_connect('localhost', '***', '***') or die(mysql_error()); 
     mysql_select_db('jschaible1') or die(mysql_error()); 

     $queryString = "insert into BlogPost values (null, '" . $item->Title . "', '" . $item->Body . "', " . "now());"; 

     $result = mysql_query($queryString) or die(mysql_error()); 

     $dbResult = mysql_query('select * from blogpost where Title = "' . $item->Title . '";') or die(mysql_error()); 
     while ($row = mysql_fetch_array($dbResult)) { 
      $tableID = $row['BlogPostID']; 
     } 

     foreach($tags as $t) { 
      $queryString = "insert ignore into Tag values('" . strtolower($t) . "');"; 
      mysql_query($queryString) or die(mysql_error()); 

      $queryString = "insert into blogposttag values (" . $tableID . ", '" . strtolower($t) . "');"; 
      mysql_query($queryString) or die(mysql_error()); 
     } 

     echo $connection; 
     mysql_close($connection) or die(mysql_error()); 
    } 

函數被調用是這樣的:

<?php 
    session_start(); 

    $errors = ''; 

    if (!isset($_SESSION['dadfg6d5f6df54'])) 
     header('Location:admin.php'); 
    else { 
     include('Classes.php'); 
     include('mySql.php'); 
     include('utils.php'); 

     if(isset($_POST['Submit'])) { 
      if ($_POST['Title'] == '') { 
       $errors = 'Post must have a title!'; 
      } 
      else if ($_POST['PostBody'] == '') { 
       $errors = 'Post must be something!'; 
      } 
      else if (strlen($_POST['PostBody']) < 10) { 
       $errors = "Write something substantial, c'mon!"; 
      } 
      else if ($_POST['Tags'] == '') { 
       $errors = "At least one tag must be entered"; 
      } 
      else { 
       $newPost = new BlogPost(NULL, sanitize($_POST['Title']), sanitize($_POST['PostBody']), NULL); 

       $newPost->Title = addEmoticons($newPost->Title); 
       $newPost->Body = addEmoticons($newPost->Body); 

       $tags = str_replace(',', '', $_POST['Tags']); 
       $tags = str_replace(';', '', $tags); 
       $tags = explode(' ', $tags); 

       error_reporting(E_ALL); ini_set('display_errors', 1); 
       addPost($newPost, $tags) or die(); 

       $errors = 'Post added successfully'; 
      } 
     } 
    } 
?> 

當它到達mysql_close(),頁面只是停止執行,我得到一個空白頁面。這讓我非常沮喪,我不明白爲什麼會發生這種情況,尤其是看到前一行中的回顯如何顯示「資源ID#6」。我沒有收到任何錯誤消息,只是一個空白頁!請幫忙!

+0

打開錯誤報告。 '的error_reporting(E_ALL); ini_set('display_errors',1);'也發佈如何調用函數 –

+0

mysql_close()將在失敗時返回FALSE,並且如果腳本已經確定它不再需要該資源,它將關閉它隱式地在你明確的調用之前。因此,沒有什麼可以關閉,它返回false,並觸發你的die()調用。只要刪除'die()'。 –

+0

我試圖刪除死()。該頁面剛剛打開,我收到一個白頁 – Jack

回答

2

你的函數沒有返回值。因此它返回NULL其中evaluates as a "falsy" value。由於您按照or die()的呼叫關注它,因此錯誤評估會觸發or die()並終止您的腳本。

// Don't do this: 
addPost($newPost, $tags) or die(); 

// Do this: 
addPost($newPost, $tags); 

在你的功能,你可以return TRUE結束,但除非你想返回根據您的文章添加成功或失敗的值是完全不必要的。你的方式,die()只是造成不必要的傷害。由於函數中所有潛在的失敗點都將因錯誤而終止腳本,因此返回TRUE沒有太大意義。函數調用後,請刪除die()

+0

這個修好了,非常感謝!我不記得最初發生了什麼,但我遇到了另一個錯誤,我開始在試圖使它工作的所有事情上投擲「或死()」。我對php還是有點新的,我想我認爲「或die()」與C語言中的「try {} catch {}」是等價的。謝謝! – Jack

+1

@Jack PHP [有它自己的try/catch](http://php.net/manual/en/language.exceptions.php),但並非所有的語言方面都會拋出異常。調試的'或die()'方法是從Perl習慣中繼承的一個不幸的保留。相反,我建議總是將數據庫調用返回到一個變量,然後測試變量。 '$ result = mysql_query(....); if(!$ result){echo mysql_error();} else {do_what_you_wanted()}' –

+0

謝謝。這是一個學校項目,他們主要關注純粹的PHP方面,我們只簡要介紹一下數據庫連接部分。當涉及到PHP的這個方面時,我並不是那麼熟悉最佳實踐和類似的東西。 – Jack