Получить данные из MySQL с помощью ООП - PullRequest
3 голосов
/ 17 июня 2011

Я новичок в ООП PHP.Я пытаюсь создать класс, который будет соединять, запрашивать и извлекать данные. Я выполнил приведенную ниже кодировку

class MySQL {

    private $set_host;
    private $set_username;
    private $set_password;
    private $set_database;

     public function __Construct($set_host, $set_username, $set_password){
        $this->host = $set_host;
        $this->username = $set_username;
        $this->password = $set_password;
        $con= mysql_connect($this->host, $this->username, $this->password);
        if(!$con){ die("Couldn't connect"); }
    }


    public function Database($set_database)
    {   
        $this->database=$set_database;
        mysql_select_db($this->database)or die("cannot select Dataabase");
    }

    public function Fetch($set_table_name){
        $this->table_name=$set_table_name;
        $query=mysql_query("SELECT * FROM ".$this->table_name); 
    $result= mysql_fetch_array($query);
    }
}

$connect = new MySQL('localhost','root','');
$connect->Database('cms');
$connect->Fetch('posts');

, чего я пытаюсь добиться, это

$connect = new MySQL('localhost','root','');
$connect->Database('cms');
$connect->Fetch('posts');

, и яхочу получить данные в таком формате

echo $result[0];

, но у меня нет такой логики, чтобы это произошло, помогите

Спасибо!

Ответы [ 4 ]

11 голосов
/ 17 июня 2011

Ваша функция Fetch извлекает только одну строку из базы данных, и вы не возвращаете результаты ...

Метод не самый лучший, но для достижения того, что вы пытаетесь сделать:

public function Fetch($set_table_name){
    $query=mysql_query("SELECT * FROM ".$set_table_name); 
    $result = array();
    while ($record = mysql_fetch_array($query)) {
         $result[] = $record;
    }
    return $result;
}

Это сделает каждую строку частью $ result, но вам нужно будет получить к ней следующий доступ:

Вы бы вызвали функцию извлечения следующим образом:

$result = $connect->Fetch('posts');

echo $result[0]['columnName'];  // for row 0;

Или в цикле:

for ($x = 0; $x < count($result); $x++) {
   echo $result[$x][0] . "<BR>";  // outputs the first column from every row
}

Тем не менее, извлечение всего набора результатов в память не является хорошей идеей (некоторые скажут, что это очень плохая идея).

Редактировать: Похоже, что у вас есть другие проблемы с вашим классом ... Я должен бежать, но завтра проверю, и если другие не уладят вас, я расширю.

Edit2: Хорошо, собираемся сделать очередной урок в вашем классе и попытаться объяснить несколько вещей:

class MySQL {

  //declaring the private variables that you will access through $this->variable;
  private $host;  
  private $username;
  private $password;
  private $database;
  private $conn;  // Adding the connection, more on this later.

  public function __Construct($set_host, $set_username, $set_password){
    $this->host = $set_host;
    $this->username = $set_username;
    $this->password = $set_password;
    // Combining the connection & connection check using 'or'
    // Notice that I removed the semi-colon after the mysql_connect function
    $this->conn = mysql_connect($this->host, $this->username, $this->password)
                  or die("Couldn't connect");
  }

  public function Database($set_database)
  {   
    $this->database=$set_database;
    // Adding the connection to the function allows you to have multiple 
    // different connections at the same time.  Without it, it would use
    // the most recent connection.
    mysql_select_db($this->database, $this->conn) or die("cannot select Dataabase");
  }

  public function Fetch($table_name){
    // Adding the connection to the function and return the result object instead
    return mysql_query("SELECT * FROM ".$table_name, $this->conn);         
  }

}

$connect = new MySQL('localhost','root','');
$connect->Database('cms');
$posts = $connect->Fetch('posts');

if ($posts && mysql_num_rows($posts) > 0) {
     echo "Here is some post data:<BR>";
     while ($record = mysql_fetch_array($posts)) {
         echo $record[0];  // or a quoted string column name instead of numerical index.
     }
} else {
     echo "No posts!";
}

Надеюсь, это поможет ... Это должно как минимум начать. Если у вас есть дополнительные вопросы, задавайте их отдельно.

1 голос
/ 17 июня 2011

Это потому, что $ result установлен внутри функции Fetch. Он не будет доступен вне функции Fetch.

Вместо этой строки $result= mysql_fetch_array($query); вам понадобится что-то вроде return mysql_fetch_array($query);.

А потом в вашем коде

$row = $connect->Fetch('posts');
// do something with $row

С другой стороны, ваша функция Fetch применима только к запросам базы данных, которые возвращают одну строку. Вам придется разделить вызовы mysql_query & mysql_fetch_array на другую функцию, если вы хотите перебрать строки в результате запроса.

И еще одно замечание: вам не нужно инкапсулировать этот код в класс. PHP уже предоставляет классы баз данных на основе ООП, называемые PDO или PHP Data Objects. В этом есть некоторая кривая обучения, но это лучшая практика, которая поможет защитить ваш код от таких вещей, как внедрение SQL.

Это довольно хороший урок: http://www.giantflyingsaucer.com/blog/?p=2478

0 голосов
/ 16 июля 2018
<?php   
 //database.php  
 class Databases{  
      public $con;  
      public function __construct()  
      {  
           $this->con = mysqli_connect("localhost", "root", "", "giit");  
           if(!$this->con)  
           {  
                echo 'Database Connection Error ' . mysqli_connect_error($this->con);  
           }  
      }  
      public function insert($table_name, $data)  
      {  
           $string = "INSERT INTO ".$table_name." (";            
           $string .= implode(",", array_keys($data)) . ') VALUES (';            
           $string .= "'" . implode("','", array_values($data)) . "')";  
           if(mysqli_query($this->con, $string))  
           {  
                return true;  
           }  
           else  
           {  
                echo mysqli_error($this->con);  
           }  
      }  
      public function selectmulti($selecttype,$table_name)  
      {  
           $array = array();  
           $query = "SELECT ".$selecttype." FROM ".$table_name."";  
           $result = mysqli_query($this->con, $query);  
           while($row = mysqli_fetch_assoc($result))  
           {  
                $array[] = $row;  
           }  
           return $array;  
      } 
     public function selectsingle($selecttype,$table_name)  
      {   
           $query = "SELECT ".$selecttype." FROM ".$table_name."";  
           $result = mysqli_query($this->con, $query);  
           $row = mysqli_fetch_assoc($result);

           return $row;  
      }  
 } 

 ?>  

<?php
$data = new Databases;  
$post_data = $data->selectmulti('*','centerdetail');  

$n = 1;
foreach($post_data as $post)  
{ 
    echo $n.'.'.$post['CenterCode'].'___';
    $n += 1;
}

echo '<br>';


$post_data = $data->selectsingle('*','centerdetail');  

echo $post_data['CenterCode'];

?>
0 голосов
/ 11 августа 2013

Я бы сделал функцию, которая возвращает значение объекта.

public function returnData($data){
  return $this->$data;
}

Затем на странице, где вы хотите получить данные, просто инициируйте класс и вызовите функцию внутри этого класса.

$post->returnDate("row name here");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...