2012-11-21 79 views
2

所以我有一個問題,通過php中的mysqli更新mysql表。數據庫表不會用Mysqli更新

數據庫連接和類:

<?php 
class testDB extends mysqli { 
    private static $instance = null; 

    private $user = "tester"; 
    private $pass = "tester01"; 
    private $dbName = "testdb"; 
    private $dbHost = "localhost"; 

public static function getInstance() { 
    if (!self::$instance instanceof self) { 
    self::$instance = new self; 
    } 
    return self::$instance; 
} 

public function __clone() { 
    trigger_error('Clone is not allowed.', E_USER_ERROR); 
} 
public function __wakeup() { 
    trigger_error('Deserializing is not allowed.', E_USER_ERROR); 
} 

private function __construct() { 
    parent::__construct($this->dbHost, $this->user, $this->pass, $this->dbName); 
    if (mysqli_connect_error()) { 
     exit('Connect Error (' . mysqli_connect_errno() . ') ' 
       . mysqli_connect_error()); 
    } 
    parent::set_charset('utf-8'); 
} 

public function verify_credentials ($username, $password){ 
    $username = $this->real_escape_string($username); 
    $password = $this->real_escape_string($password); 
    $result = $this->query("SELECT 1 FROM users WHERE user_username = '" . $username . "' AND user_password = '" . $password . "'"); 
    return $result->data_seek(0); 
} 

public function get_vitae() { 
    return $this->query("SELECT * FROM vitae"); 

public function update_vitae($text, $id) { 
    $text = $this->real_escape_string($text); 
    $this->query("UPDATE vitae SET vitae_text=".$text." WHERE vitae_id = ".$id); 
} 
} 
?> 

這裏的頁面代碼:

上面的標題,我們通過檢查確保有一個會話啓動登錄;然後導入數據庫類,其餘的在所述形式重新提交該相同頁稱爲:

<?php 
session_start(); 
if (!array_key_exists("username", $_SESSION)) { 
    header('Location: index.php'); 
    exit; 
} 

require_once("includes/db.php"); 

$vitae_empty = false; 

if ($_SERVER['REQUEST_METHOD'] == "POST") { 
    if ($_POST['text'] == "") { 
     $vitae_empty = true; 
    } else if ($_POST["text"]!="") { 
     testDB::getInstance()->update_vitae($_POST["text"], $_POST["id"]); 
     header('Location: manage.php'); 
     exit; 
} 
} 

?> 

在主體(頭部和HTML的其餘部分經由「require_once」被導入)

<section> 
     <div class="grid_3 header_line"><h2>Update for CV</h2></div> 
     <div class="grid_3"> 
      <?php 
      $result = testDB::getInstance()->get_vitae(); 
      $vitae = mysqli_fetch_array($result);     
      ?> 

      <form name="editvitae" action="editvitae.php" method="POST"> 

       <textarea name="text" rows="50" cols="100"><?php echo $vitae['vitae_text'];?></textarea><br/> 
       <?php if ($vitae_empty) echo "Please enter some text.<br/>";?> 

       <input type="hidden" name="id" value="<?php echo $vitae["vitae_id"];?>" /> <br/> 
       <input type="submit" name="savevitae" value="Save Changes"/> 
      </form> 
     </div> 
     <div class="grid_3"> 
      <p><a href="manage.php">&lsaquo; back to management consol</a></p> 
     </div> 
    </section> 

「body」的標籤後:

<?php mysql_free_result($result);?> 

正如你可以看到這是直接從數據庫中的「履歷」文本,然後將其與變化更新表循環到同一頁。它也檢查了'文本'框不是空的。

此代碼在另一個應用程序中工作;我不明白爲什麼它不會在這裏工作。在開始警告我注射和安全性之前,我已經將大部分內容都剝離出來,試圖找到更新的問題。只要我能弄明白,它就會回來。

我試過剝離文本檢查;不同的變量名稱;在更新數據庫之前將後值轉儲到數組中;將帖子值放入靜態變量中;檢查我的所有拼寫等...

我錯過了一些東西,我覺得它會很簡單。

+0

在你的UPDATE查詢中,你沒有引用'$ text';如果您添加文字,會導致問題。但是你使用mysqli,你應該使用綁定參數,因爲它使你的代碼更安全。 – andrewsi

+0

@andrewsi是的,這是一個很好的做法。 'mysqli :: prepare()'和'mysqli :: bind_params()'是個好主意。 – jpumford

+0

當然很簡單。感謝安德魯斯;您的評論有幫助;這是在我的逃跑。 – user1843278

回答

0

隨時通過mysqli運行UPDATE您需要運行$mysqli->commit();方法。

您的新update_vitae是:

public function update_vitae($text, $id) { 
    $text = $this->real_escape_string($text); 
    $this->query("UPDATE vitae SET vitae_text=".$text." WHERE vitae_id = ".$id); 
    $this->commit; 
} 

的mysqli也有一個自動提交功能,可以開啓或關閉進行切換:

$this->autocommit(true); //on 
$this->autocommit(false); //off 
+0

只有在不使用自動提交的情況下才會如此。 – andrewsi

+0

他不是,通過查看他的代碼。不過,我會添加一個註釋,謝謝。 – jpumford

+0

沒有骰子,我添加'$ this-> commit;'到我的更新函數的末尾,沒有任何東西。 – user1843278

0

因此,答案確實是簡單的。正如Andrewsi所建議的那樣,我正在逃避更新字符串。下面是固定它的更新:

public function update_vitae($text, $id) { 
    $text = $this->real_escape_string($text); 
    $this->query("UPDATE vitae SET vitae_text = '$text' WHERE vitae_id = ".$id); 
} 

感謝您的幫助!

我一直在設計網站近10年,但我現在只是進入'真正'的PHP編碼,而不是使用準備好的類和Dreamweaver的內置函數。學到很多,但在有限的空餘時間裏很有趣。

+0

哦;我會研究綁定的參數;任何簡化和保護我的代碼是件好事。 – user1843278

0
$result = $this->query("SELECT 1 FROM users WHERE user_username = '" . $username . "' AND user_password = '" . $password . "'"); 

使用邏輯與進行用戶認證時要小心。在追蹤任何類型的密碼之前先完全驗證用戶名可能更明智。關於插入的許多例子,我這​​樣說 - ;那裏1 = 1 - 和東西那(但不是專門這個聲明)。當然,這可能需要兩個查詢,但至少您只需處理一條信息以確定訪​​問者是否有效。另一個好處是可以節省處理,因爲您不必在應用程序或數據庫中處理散列/加密用戶密碼(直到用戶名已被驗證)。