2013-03-03 2 views
8

Можно ли связать имя таблицы?PHP PDO - имя таблицы привязки?

Я хочу, чтобы класс читал столбцы из таблиц и, в зависимости от типа поля, генерировал входы формы для меня. Когда я $form = new form("users");, конструктор должен начать с получения имен полей из таблицы с помощью следующего кода:

class form{ 

    public function __construct($table, $skip = array("id")){ 
     $pdo = new PDO('mysql:host=localhost;dbname=site;',USER,PASS); 

     $query = $pdo->prepare("DESCRIBE :table"); 

     $query->bindValue(':table', $table, PDO::PARAM_STR, strlen($table)); 

     $query->execute(); 

     while($field = $query->fetch(PDO::FETCH_NUM)){ 
      var_dump($field); 
      echo "<br /><br />"; 
     } 

     unset($pdo); 
    } 
} 

Это прекрасно работает, когда я указываю «пользователей» вместо «: таблица» в подготовке , но привязка работает, и я уверен, что это потому, что он пытается связать имя таблицы. Кроме того, это необходимо привязать, потому что я хотел бы иметь возможность передавать мои имена таблиц через $_GET и такие.

ответ

9

Можно ли связать имя таблицы?

No.

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

И вам также нужно отформатировать идентификаторы вручную. Пример: tag wiki. Почему бы не прочитать его первым?

Обновление: Как вы можете видеть, PDO оказывается неудобным для реальных задач. Итак, у вас должна быть более интеллектуальная библиотека абстракции для обработки запросов MySQL. Вот пример использования safeMysql класса, который позволит сделать ваш код значительно короче:

class form{ 
    public function __construct($table){ 
     global $db; 
     return $db->getAll("DESCRIBE ?n", $table); 
    } 
} 

2 примечания:

  • Я удалил второй параметр, поскольку нет никакого кода в вашей функции, использует его.
  • НИКОГДА не подключайтесь к классу. Вместо этого используйте уже открытое соединение. Или вы убьете свой сервер MySQL с таким количеством подключений.

Исключите реализована версия

class form { 
    public function __construct($table,$skip = array("id")){ 
     global $db; 
     $data = array(); 
     $res = $db->query("DESCRIBE ?n", $table); 
     while($row = $db->fetch($res)) { 
      if (!in_array($row['Field'],$skip)) { 
       $data[] = $row; 
      } 
     } 
     return $data; 
    } 
} 

Однако такой класс редко может быть использован по назначению - всегда есть много исключений и ручного форматирования, чтобы сделать его пригодным для использования.

+0

В этой вики в разделе «Подготовленные инструкции PDO и IN», почему вы не могли заменить строку SQL параметром для таблицы? – acutesoftware

+0

Я не знал, что есть теги wikis. Это удобно. Кроме того, почему такой класс был бы пустой тратой времени? –

+0

После всех ваших изменений ваши ответы имеют гораздо больший смысл. Я буду придерживаться простого, без привязки, PDO-запроса, поскольку он будет принимать такое же количество операторов, как и упомянутый вами класс, и сделать глобальную переменную pdo. Кроме того, класс не предназначен для создания формы от начала до конца, он просто предназначен для создания входов и меток для вас с правильным типом ввода, ярлыками с правильными «для», входы с максимальной длиной, равной максимальная длина поля в базе данных и т. д. Что касается форматирования, если вы сохраняете HTML простым, все форматирование может быть сделано очень легко в CSS. –

2

Существует класс обертка PDO в - http://www.phpclasses.org/package/5997-PHP-Database-access-abstraction-layer.html, что позволяет сделать это (хотя я новичок в PDO так, может быть, оно не используя подготовленные заявления)

Его Предложенное использование является:

$db = new DatabaseConnection('someMysqlServer', 'user', 'pass', 'database'); 

$result = $db->exec($db->filterForSql('SELECT * FROM '.$tableName.';')); 

I было бы интересно, если другие считают, что это «безопасный» способ использования PDO или нет.

+0

Независимо от того, какой класс делает такие вещи, как 'filterForSql', это непригодное для использования опасное дерьмо. Сайт требует регистрации, поэтому я не могу просмотреть его более подробно –

+0

Я удивлен, что вы говорите, что это непригодное дерьмо, когда вы не читали исходный код. Извините, но вокруг этого есть довольно противоречивая информация, и мне было бы интересно увидеть «класс Bulletproof PDO Database» - есть ли у вас какие-либо рекомендации? – acutesoftware

+0

Сама функция, которую вы отправили, более чем достаточно, чтобы судить. SQL-запрос состоит из * многих * разных частей, и для них невозможно создать общий фильтр - фильтрация для одного будет ломать другое и наоборот. У меня есть пуленепробиваемый класс для запуска mysql-запросов (но не PDO, но это не имеет значения). Вы можете найти ссылку в моем профиле. Единственный настоящий пуленепробиваемый класс, который я знаю. –

Смежные вопросы