2013-08-29 4 views
-2

Я использую PHP PDO для подключения к базе данных MySQL и возврата набора результатов, но я, кажется, получаю дубликат вывода, хотя в моей базе данных всего 2 записи.PHP PDO MySQL duplicate output

MYSQL:

mysql> SELECT * FROM nouns; 
+-----+---------------+---------+ 
| PID | german  | english | 
+-----+---------------+---------+ 
| 1 | die Männer | men  | 
| 2 | die Frauen | women | 
+-----+---------------+---------+ 
2 rows in set (0.00 sec) 

mysql> 

РНР Фрагмент 1:

$database = new MySQLConnect(); 
$database->query("SELECT german, english FROM nouns;"); 
while ($row = $database->row()->fetch()) { 
    foreach ($row as $value) { 
    $data .= $value; 
} 

РНР Фрагмент 2:

interface IMySQLSettings 
{ 
    const HOSTNAME = "hostname"; 
    const DATABASE = "database"; 
    const USERNAME = "username"; 
    const PASSWORD = "password"; 

    function __construct(); 
    function query($query); 
    function row(); 
} 

class MySQLConnect implements IMySQLSettings 
{ 
    private $hostname = IMySQLSettings::HOSTNAME; 
    private $database = IMySQLSettings::DATABASE; 
    private $username = IMySQLSettings::USERNAME; 
    private $password = IMySQLSettings::PASSWORD; 

    private $connect; 
    private $query; 

    function __construct() 
    { 
     $this->connect = new PDO("mysql:host=$this->hostname;dbname=$this->database", $this->username, $this->password); 
     $this->connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 

    function query($query) 
    { 
     try { 
      $this->query = $this->connect->prepare("$query"); 
      $this->query->execute(); 
     } catch (PDOException $e) { 
      echo $e->getMessage(); 
     } 
    } 

    function row() 
    { 
     return $this->query; 
    } 
} 

Выход:

die Männerdie Männermenmendie Frauendie Frauenwomenwomen 
+0

Где код, который генерирует ваш выход? – Anigel

+0

опубликованный код имеет синтаксическую ошибку. также нет отладочных усилий. и, очевидно: '$ database-> row() -> fetch (PDO :: FETCH_NUM)' – hakre

+0

Исключительно ортодоксальная структура классов. И код бесполезен в той же степени ... В чем смысл иметь отличный метод row()? –

ответ

2

в вашей выборке вы должны предоставить PDO :: FETCH_NUM или PDO :: FETCH_ASSOC, поскольку значение PDO :: FETCH_BOTH является значением по умолчанию.

Может быть, когда вы создаете объект PDO добавить эту строку

$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 

PDO fetch_style Больше информации

Вот что вы получаете от php.net руководства:

PDO::FETCH_ASSOC 
Array 
(
    [NAME] => apple 
    [COLOUR] => red 
) 

PDO::FETCH_BOTH 
Array 
(
    [NAME] => banana 
    [0] => banana 
    [COLOUR] => yellow 
    [1] => yellow 
) 
+0

ваш ответ работает, и я соглашусь через 9 минут, как указано – user1408643

0

рефакторинга версия со всеми ненужный код выведен, но необходимые функции добавлены.

class MySQLConnect 
{ 
    private $connect; 

    function __construct() 
    { 
     $dsn = "mysql:host=".IMySQLSettings::HOSTNAME.";dbname=".IMySQLSettings::DATABASE; 
     $opt = array(
      PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION, 
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC 
     ); 
     $this->connect = new PDO($dsn, IMySQLSettings::USERNAME,IMySQLSettings::PASSWORD, $opt); 
    } 

    function query($query, $params = array()) 
    { 
     $stmt = $this->connect->prepare($query); 
     return $stmt->execute($params); 
    } 
} 

$db = new MySQLConnect(); 
$stmt = $db->query("SELECT german, english FROM nouns"); 
foreach ($stmt as $row) { 
    foreach ($row as $value) { 
    $data .= $value; 
} 

Хотя я все это IMySQLSettings вещь, это совершенно бесполезное как интерфейс.
Что делать, если мне нужна другая база данных для подключения? Переопределить MySQLConnect для реализации другого интерфейса?

Вместо фантазии inteerface он должен быть простым массивом, переданным в конструктор MySQLConnect.