Создание запросов SQL для базы данных MySQL


Я пишу PHP-приложение, которое работает с базой данных MySQL. Так как я довольно новыми для PHP я ищу способы, чтобы улучшить мой код. Ниже приведены две функции, create_ct_query и create_ct_query2. create_ct_query2 это результат моего рефакторинга create_ct_query. Я довольно счастлив с ней сейчас, но мне интересно, как это выглядит для других.

<?php
// experiment with versions of create_ct_query

$lvb_id_ml=30;       // lvb id
$lvb_name_ml=100;    // competition name

$lvb_competitions_table =
  array ("table_name" => "lvb_competitions",
         "table_cols" => 
         array (array ('id', $lvb_id_ml),
                array ('name', $lvb_name_ml),
                array ('age', 'INT')),
         "primary_key" => array ('id', 'age'));


function varchar ($len) {
  return "VARCHAR(" . $len . ")";
}

function primary_key ($item) {
  return $item . " PRIMARY KEY";
}


// version currently in script
function create_ct_query ($tdesc) {
  $ret_val = "CREATE TABLE " . $tdesc['table_name'] . " ( ";

  foreach ($tdesc["table_cols"] as $row) {
    if (is_numeric ($row[1])) {
      $ret_val .= $row[0] . " " . varchar ($row[1]) . ", ";
    } else {
      $ret_val .= $row[0] . " " . $row[1] . ", ";
    }
  }

  // add primary key constraint
  $ret_val .= " CONSTRAINT pk_" . $tdesc["table_name"] .
    " PRIMARY KEY (";
  if (is_array ($tdesc['primary_key'])) {
    $ret_val .= implode (",", $tdesc['primary_key']);
  } elseif (is_string ($tdesc['primary_key'])) {
    $ret_val .= $tdesc["primary_key"];
  } else {
    die ("Primary key not of right type in tdesc for " .
         $tdesc['table_name'] . "\n");
  }
  $ret_val .= "))";

  return $ret_val;
}

function create_ct_query2 ($tdesc) {
  $ret_val = "CREATE TABLE " . $tdesc['table_name'] . " (";

  $ret_val .= cols_desc ($tdesc['table_cols']) . ", ";

  $ret_val .= primary_key_constraint ($tdesc['table_name'],
                                      $tdesc['primary_key']) . "))";

  return $ret_val;
}


// create the item description from the item
// Example:
// item_desc (array ('name', 10));
//    'name VARCHAR(10)'
// item_desc (array ('name', "INT"));
//    'name INT'
function item_desc ($item) {
  return " " . $item[0] . " " .
    (is_numeric($item[1]) ? varchar($item[1]) : $item[1]);
}

// create the column description part of table creation query
// Example:
// cols_desc (array (array ('id', 10), array ('id2', INT)));
//   'id VARCHAR(10), id2 INT'
function cols_desc ($table_cols) {
  return implode (",", array_map ('item_desc', $table_cols));
}


// create the primary key constraint part of the table creation query
// primary_key_constraint ('name', 'id');
//    CONSTRIANT pk_name PRIMARY KEY (id)
// primary_key_constraint ('name', array ('id', 'id2'));
//    CONSTRAINT pk_name PRIMARY_KEY (id, id2)
function primary_key_constraint ($table_name, $primary_key_desc)  {
  return " CONSTRAINT pk_" . $table_name . " PRIMARY KEY (" . 
    (is_array($primary_key_desc) ? 
     implode (",", $primary_key_desc) :
     $primary_key_desc);
}


echo create_ct_query ($lvb_competitions_table) . "\n\n";
echo create_ct_query2 ($lvb_competitions_table) . "\n\n";


341
1
задан 15 августа 2011 в 11:08 Источник Поделиться
Комментарии
2 ответа

Предполагая, что вы защищаете себя от SQL-инъекции и тому подобное, есть только пару вещей, которые выделяются для меня:


  • Это, кажется, не ясно мне, почему закрывающую скобку для ограничения первичного ключа в create_ct_query2 (функции), а не в primary_key_constraint (функция).

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

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

  • В то время как связанные с рефакторингом, я считаю, что другие мои предложения начинают больше вникать в удобочитаемость вещи, как create_ct_query(). Это начинает чувствовать себя немного придирчивые, и практически вопрос стиля. Например, с create_ct_query(), он взял меня минута, чтобы понять, что такое "кар" означало. Лишь после того, как внутри этой функции и видим строку создается не поняла, что он сделал. Я чувствую, что что-то вроде "get_create_table_query()" или подобный будет немного более понятным.

Что касается документации, я нашел Eclipse и другие инструменты использовать следующий стиль док-блоки. К @возвращение особенно полезна для автозавершения кода из методов возвращения объекта в своей среде. Инструменты документирования, как правило, имеют встроенную поддержку для других тегов, таких как @автор, а также.

/**
* Description of someMethod()
*
* @param int $someInt
* @param ObjectName $someObj
* @return AnotherObj
*/
public function someMethod($someInt, ObjectName $someObj)
{
// ...

return new AnotherObj();
}

3
ответ дан 16 августа 2011 в 08:08 Источник Поделиться

Стилистически, это выглядит хорошо для меня. Но технически, вы хотите, чтобы охватить все ваши имена таблиц и столбцов в кавычки Апостроф, иначе ваши запросы часто не удастся, если они идут от ввода пользователя. Е. Г. имена таблиц и столбцов нужны обратные кавычки, если они содержат прочерки, а также для многих других персонажей. Смотрите описание здесь.

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

1
ответ дан 16 августа 2011 в 09:08 Источник Поделиться