2015-12-01 7 views
5

के रूप में कक्षा के अंदर डेटाबेस तालिका बनाना, मैं न केवल पठनीयता के लिए बल्कि मेरे द्वारा काम कर रहे प्रोजेक्ट के अनुकूलन के लिए भी अपने कोड को छोटा करने की चाल करने की कोशिश कर रहा हूं।फ़ंक्शन

मैंने एक क्लास बनाया है जो डेटाबेस से जुड़ता है लेकिन उपयोग करने के लिए एक फ़ंक्शन के साथ संघर्ष कर रहा हूं जो कॉलम के साथ एक टेबल बनाएगा।

वर्ग इस तरह दिखता है अब तक:

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."); 
    } 
} 

आप देख सकते हैं क्वेरी की पद्धति पहले से ही जोड़ा गया है। कैसे अपनी दौड़ है का एक उदाहरण:

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

किसी को भी संभव मुझे डालने तालिका जोड़ने के लिए समारोह जोड़ने के लिए कुछ कोड भेजा सकता है? मैं इस की कोशिश की है:

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

उपयोग:

$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

अरे, अपने वर्तमान 'query' समारोह अत्यंत एक SQL इंजेक्शन हमले के लिए अतिसंवेदनशील है, तो आप स्वच्छ या आपकी क्वेरी तो एक हमलावर आसानी से नष्ट करने या अपने डेटाबेस समझौता कर सकता है तैयार नहीं है। आप 'mysql' लाइब्रेरी का भी उपयोग कर रहे हैं जिसे वर्षों से बहिष्कृत कर दिया गया है, आपको कम से कम' mysqli' या बेहतर अभी तक 'पीडीओ' का उपयोग करना चाहिए। पीडीओ आपको बहुत सारे सिरदर्द बचाएगा और मैंने डीबी कक्षा के लिए यहां एक बुनियादी ढांचा लिखा है जो एसक्यूएल इंजेक्शन हमलों को प्रबंधित करता है https://github.com/alexmk92/ASFramework/blob/master/app/core/models/Database.php – Alex

+0

@ एलेक्स बहुत बहुत धन्यवाद! वास्तव में मुझे क्या चाहिए! मैं इसके लिए स्रोत कोड में एक लिंक रखूंगा! –

+0

प्रश्न, मैं इसका उपयोग कैसे करूं? मैं SQLi के लिए उपयोग नहीं किया जाता है। यह होगा: $ डीबी = नया डेटाबेस(); $ डीबी-> लाने ('तालिका से चुनें'); और मैं इनके साथ एक टेबल कैसे बनाऊंगा? इसके अलावा, धन्यवाद! @Alex –

उत्तर

1

मैं MySQLi या PDO को देखकर जब से तुम पदावनत समारोह mysql जो कमजोर है, क्योंकि यह अभी खड़ा है का उपयोग कर रहे सिफारिश करेंगे। मैंने आपको शुरू करने के लिए अपनी कक्षा (परीक्षण नहीं किया) अपडेट किया है। यह तालिका बनाने में सक्षम नहीं होने के आपके मूल मुद्दे को भी ठीक करता है।

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(); 
    } 
}