2017-03-02 125 views
1

我在這裏有一些小問題。我是OOP的新手,所以這個問題聽起來很愚蠢,但我找不到任何有用的信息。如何在OOP PDO中編寫準備和執行語句?

我想登錄到數據庫,並把用戶輸入的值放在裏面,我想問你,我應該在哪個地方編寫PDO準備和執行語句?我知道它們是需要的,但我不知道如何正確寫入它......除此之外,我還得到一個錯誤:「PDO類的對象無法在第24行轉換爲字符串」。感謝您的幫助,這是我的代碼:

<?php 
class Connection { 
public $connection; 
public $dbHost = 'localhost'; 
public $dbName = 'employees'; 
public $charset = 'charset=utf8'; 
public $dbUser = 'root'; 
public $dbPassword = ''; 

public function __construct() { 
    try { 
     $this->connection = new PDO ("mysql:host=$this->dbHost;$this->dbName;$this->dbUser; 
     $this->dbPassword"); 
     $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    } 
    catch (PDOException $e) { 
     echo "There is something wrong with the database".$e->getMessage(); 
    } 
} 
function insertUserValues($tableName, $data) { 
    $query = "INSERT INTO ".$tableName."("; 
    $query .= implode (",",array_keys($data)).') VALUES ('; 
    $query .= "'" . implode ("','",array_values($data))."')"; 
} 
} 
$users = new Connection(); 
?> 
+3

您需要一次提出一個問題。編寫類是一回事,執行準備好的語句是另一個 –

+0

哪一行是24? –

+0

$ query。=「'」。 implode(「','」,array_values($ data))。「')」; – HELPME

回答

1

我不是解釋真的很好BRU,但我只看到,有很長一段時間後,沒有回答。我爲你創建了一個基本的類來使用PDO插入值,我希望它會指向你正確的方向,我也會爲你分享一些有用的鏈接。

首先連接。

我可以看到你已經完成了班上的連接,但下面是最適合的pdo連接。

$host = '127.0.0.1'; 
    $db = 'YourDatabase'; 
    $user = 'YourDBUser'; 
    $pass = 'YourDBPass'; 
    $charset = 'utf8'; 

    $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; 
    $opt = [ 
      PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION, 
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 
      PDO::ATTR_EMULATE_PREPARES => false, 
      ]; 

$dbh = new PDO($dsn, $user, $pass, $opt); 

這就是您如何設置適當的PDO連接。 dns代表數據源名稱參考上面的https://phpdelusions.net/pdo#dsn這個傢伙解釋的更好。你需要知道的一切。

現在你怎麼把這個連接和你的班級放在一起?

好吧,我將創建一個文件收集pdoClass.php並從該類中工作。

<?php 
class Connection 
{ 
    private $host = "127.0.0.1"; 
    private $dbName = "YourDB"; 
    private $user = "YourUser"; 
    private $pass = "YourPass"; 
    private $charset = 'utf8'; 

    private $dbh; 
    private $error; 
    private $stmt; 

    //connection 
    public function __construct() 
    { 
     $dsn  = "mysql:host=" . $this->host . ";dbname=" . $this->dbName . ";charset=" . $this->charset; 
     $options = array(
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 
      PDO::ATTR_EMULATE_PREPARES => false 
     ); 

     try { 
      // setup connection 
      $this->dbh = new PDO($dsn, $this->user, $this->pass, $options); 
     } 
     //catch any errors 
     catch (PDOException $e) { 
      $this->error = $e->getMessage(); 
     } 

    } 

    //prepare statement 
    public function insertUserValues($query) 
    { 
     $this->stmt = $this->dbh->prepare($query); 
    } 

    //bind values 
    public function bind($param, $value, $type = null) 
    { 
     if (is_null($type)) { 
      switch (true) { 
       case is_int($value): 
        $type = PDO::PARAM_INT; 
        break; 
       case is_bool($value): 
        $type = PDO::PARAM_BOOL; 
        break; 
       case is_null($value): 
        $type = PDO::PARAM_NULL; 
        break; 
       default: 
        $type = PDO::PARAM_STR; 
      } 
     } 
     //actual value binding 
     $this->stmt->bindValue($param, $value, $type); 
    } 
    //execute statement 
    public function run() 
    { 
     return $this->stmt->execute(); 
    } 
} 

?> 

基本上,這就是所有你需要設置數據庫和函數插入你的分貝,我試圖評論一些部分。

現在使用這個類創建index.php或者你喜歡什麼。那麼包含類

<?php 
    include'pdoClass.php'; 


    $users = new Connection(); 

    $users->insertUserValues('INSERT INTO test (name, age, description) VALUES(?,?,?)'); 
    $users->bind(1, 'User'); //bind each value 
    $users->bind(2, 391); // bind 
    $users->bind(3, 'This is a value'); 
    if($database->run()){ 

     echo "record inserted"; 
    } 

?> 

做,如果您有任何問題或像我解釋什麼,隨意評論下面我會盡我所能來幫助ü。

編輯:如果你需要獲取的結果,也可以使一個新的功能,在班上,

單列:

public function SingleRow(){ 
     $this->run(); 
     return $this->stmt->fetch(); 
    } 

看到我們使用fetch();只取一排。大多數人在獲取結果時會像這樣獲取它們fetch(PDO::FETCH_ASSOC),但是因爲我們做了正確的連接並在連接中定義了默認的獲取模式,所以我們不需要我們只需要使用fetch();

,以顯示在您的index.php文件的結果,這是你會怎麼做:

$users->insertUserValues("SELECT name, age, description FROM test WHERE name = :name"); 
$users->bind(':name','joe'); 
$row = $users->SingleRow(); 

echo '<pre>'; 
print_r($row); 
echo '</pre>'; 

這將顯示喬的結果作爲數組。

從我們的db中獲得所有結果我們做了另一個功能來顯示所有的結果。

public function All(){ 
      $this->run(); 
      return $this->stmt->fetchall(); 
     } 

你看到區別,現在我們使用fetchall(),因爲我們希望所有的結果。

$users->insertUserValues("SELECT * FROM test"); 
    $row = $users->All(); 

    echo '<pre>'; 
    print_r($row); 
    echo '</pre>'; 
+0

非常感謝你的時間,男人,它幫助了我很多! – HELPME

+0

偉大的人,我已經編輯瞭如何獲取剛剛插入的數據的答案,請繼續閱讀本博客:https://phpdelusions.net/pdo –