2015-12-01 18 views
5

Kodumun yalnızca okunabilirlik için değil, üzerinde çalıştığım projenin özelleştirilmesi için kısaltılması hilesi yapmaya çalışıyorum.Bir Sınıf Olarak İşlev İçinde DataBase Tablosu Oluşturma

DataBase'e bağlanan ancak sütunlar içeren bir tablo yaratacak bir işlevle mücadele eden bir sınıf oluşturdum.

sınıf şimdiye kadar bu gibi görünür:

class DataBase { 

    private $link; 
    private $host, $username, $password, $database; 

    public function __construct($host, $username, $password, $database){ 
     $this->host  = $host; 
     $this->username = $username; 
     $this->password = $password; 
     $this->database = $database; 

     $this->link = mysql_connect($this->host, $this->username, $this->password) 
      OR die("There was a problem connecting to the database."); 

     mysql_select_db($this->database, $this->link) 
      OR die("There was a problem selecting the database."); 

     return true; 
    } 

    public function query($query) { 
     $result = mysql_query($query); 
     if (!$result) die('Invalid query: ' . mysql_error()); 
     return $result; 
    } 

    public function __destruct() { 
     mysql_close($this->link) 
      OR die("There was a problem disconnecting from the database."); 
    } 
} 

sorgu yöntemi zaten eklenmiş görebileceğiniz gibi. onun run nasıl bir örnek:

$db = new DataBase('localhost',$user,$pass,$name); 
$db->query('SELECT * FROM table WHERE id="0"'); 

olası kimse bana ekleme tablo eklemek için işlev eklemek için bazı kod gönderdi olabilir mi? Bunu denedim:

public function create_table($t_data) { 
    $result = $t_data; 
    if (!$result) die('Invalid query: ' . mysql_error()); 
    return $result; 
} 

Kullanımı: Sana şu anda haliyle savunmasızdır kaldırılmış işlevini mysql kullandığınız beri MySQLi veya PDO bakarak öneriyoruz

$t_data = 'CREATE TABLE log_users(
    uid VARCHAR(1024) NOT NULL, 
    username VARCHAR(33) NOT NULL, 
    password VARCHAR(18) NOT NULL, 
    admin VARCHAR(1) DEFAULT 0, 
    key VARCHAR(18) NOT NULL, 
    constant VARCHAR(1) DEFAULT 0)'; 

$db->create_table($t_data); 
+0

Hey, geçerli 'query' fonksiyonu dezenfekte ya da öylesine bir saldırganın kolayca yok etmek veya veritabanını tehlikeye atabilecek Sorgunuzla hazırlamak değil, bir SQL Injection saldırısı son derece duyarlıdır. Yıllardır kullanımdan kaldırılan 'mysql' kütüphanesini de kullanıyorsunuz, en azından' mysqli' ya da daha iyisi 'PDO'yu kullanmalısınız. PDO size çok fazla baş ağrısı kurtaracak ve SQL enjeksiyon saldırılarını yöneten bir DB sınıfı için temel bir çerçeve yazdım. Https://github.com/alexmk92/ASFramework/blob/master/app/core/models/Database.php – Alex

+0

@Alex Thankyou çok fazla! Bu aslında ihtiyacım olan şey! Bunun için kaynak kodunda bir bağlantı tutacağım! –

+0

Soru, bunu nasıl kullanırdım? Ben SQLi'ye alışmam. $ db = new Veritabanı(); $ db-> getirme ('SELECT FROM * table'); & Bunlarla nasıl bir tablo oluştururum? Ayrıca teşekkür ederim! @Alex –

cevap

1

. Başlamanız için sınıfınızı (test edilmemiş) güncelledim. Bu ayrıca bir tablo oluşturamamaktaki orijinal sorununuzu düzeltir.

class DataBase { 

    private $link; 
    // May not need these, see updated __construct method 
    private $host, $username, $password, $database; 

    public function __construct($host, $username, $password, $database){ 
     // Unless you need them elsewhere, no reason to set $this->host, $this->username, etc...you can just access directly like below 
     $this->link = new mysqli($host, $username, $password, $database); 

     // Check connection (which also checks selection of database) 
     if ($this->link->connect_error) { 
      die("Connection failed: " . $this->link->connect_error); 
     } 
    } 

    // You will need to research and update this to work with mysqli (right now it's ripe for SQL injection)! 
    public function query($query) { 
     $result = mysql_query($query); 
     if (!$result) die('Invalid query: ' . mysql_error()); 
     return $result; 
    } 

    // This method will create a table based on the SQL you send it 
    public function create_table($sql) { 
     if ($this->link->query($sql) === TRUE) { 
      return "Table created successfully"; 
     } else { 
      return "Error creating table: " . $this->link->error; 
     } 
    } 

    // Close connection 
    public function __destruct() { 
     $this->link->close(); 
    } 
}