Как Вы справляетесь с SQL-запросами

Вы должны использовать @Input() для передачи значений от parent до child и @Output() для передачи значений от child до parent ]. [1 110]

Дочерний HTML:

<button type="button" class="icon-button" (click)="update()">
</button>

Дочерний компонент:

export class NotificationMenuComponent implements OnInit {
    @Output() updateUnread = new EventEmitter<string>();

    update() {
        this.updateUnread.emit("I am working man!");
    }
}

Родительский HTML:

<notification-menu (updateUnread)= "unreadNotification($event)"></notification-menu>

Родительский компонент:

export class AppComponent implements OnInit {
    constructor( private notificationService: NotificationService ) {}

    unreadNotification(dataFromChild: string) {
        console.log(dataFromChild);
    }
}
14
задан Rik Heywood 1 September 2008 в 11:38
поделиться

10 ответов

Лучший план действий для Вас будет зависеть от того, как Вы приближаетесь к своему доступу к данным. Существует три подхода, которые можно проявить:

  • хранимые процедуры Использования
  • Сохраняют запросы в коде (но поместите все свои запросы в функции и зафиксируйте все для использования PDO для параметров, как отмечалось ранее)
  • Использование инструмент ORM

, Если бы Вы хотите передать свой собственный необработанный SQL механизму базы данных затем, хранимые процедуры были бы способом пойти, если все, что Вы хотите сделать, вытаскивают необработанный SQL из Вашего PHP, кодируют, но сохраняют это относительно неизменным. Хранимые процедуры по сравнению с необработанными дебатами SQL являются чем-то вроде священной войны, но K. Scott Allen высказывает точное мнение - хотя одноразовое - в статье приблизительно базы данных управления версиями :

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

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

Наличие уровня API на DB дает лучшее формирование рисунка обязанностей между командой DB и Командой разработчиков за счет части гибкости, которую Вы имели бы, если бы запрос был сохранен в коде, то однако проекты PHP, менее вероятно, имели бы достаточно значительные команды для пользы из этого формирования рисунка.

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

Независимо от того, выбираете ли Вы не использовать хранимые процедуры, хотя, необходимо по крайней мере удостовериться, что каждая операция базы данных хранится в независимой функции вместо того, чтобы быть встроенной в каждый из сценариев страницы - по существу уровень API для DB, который сохраняется и имеющий версию с кодом. При использовании хранимых процедур это будет эффективно означать, что у Вас есть два уровня API для Вашего DB, один с кодом и один с DB, который можно чувствовать, излишне усложняет вещи, если проект не имеет отдельных команд. Я, конечно, делаю.

, Если проблемой является одна из опрятности кода, существуют способы сделать код с SQL создавшим затор в нем более презентабельный, и класс UserManager, показанный ниже, является хорошим способом запуститься - класс только содержит запросы, которые касаются 'пользовательской' таблицы, каждый запрос имеет свой собственный метод в классе, и запросы располагаются с отступом в подготовить операторы и форматируются, поскольку Вы отформатировали бы их в хранимой процедуре.

// UserManager.php:

class UserManager
{
    function getUsers()
    {
        $pdo = new PDO(...);
        $stmt = $pdo->prepare('
            SELECT       u.userId as id,
                         u.userName,
                         g.groupId,
                         g.groupName
            FROM         user u
            INNER JOIN   group g
            ON           u.groupId = g.groupId
            ORDER BY     u.userName, g.groupName
        ');
        // iterate over result and prepare return value
    }

    function getUser($id) {
        // db code here
    }
}

// index.php:
require_once("UserManager.php");
$um = new UserManager;
$users = $um->getUsers();
foreach ($users as $user) echo $user['name'];

Однако, если Ваши запросы весьма схожи, но у Вас есть огромные числа перестановок в Ваших условиях запроса как сложная подкачка страниц, сортировка, фильтрация, и т.д., Объектный/Реляционный инструмент картопостроителя является, вероятно, способом пойти, хотя процесс перестройки Ваш существующий код для использования инструмента мог быть вполне сложным.

, Если Вы решаете исследовать инструменты ORM, необходимо посмотреть , Продвигают , компонент ActiveRecord Yii или король-папа PHP ORM, Доктрина . Каждый из них дает Вам способность программно создать запросы к Вашей базе данных со всем способом сложной логики. Доктрина является самой полнофункциональной, позволяя Вам обработать Вашу базу данных по шаблону с вещами как Вложенный шаблон дерева Набора из поля.

С точки зрения производительности, хранимые процедуры являются самыми быстрыми, но обычно не очень по сырым данным sql. Инструменты ORM могут оказать значительное влияние производительности различными способами - неэффективные или избыточные запросы, огромный файл IO при загрузке библиотек ORM по каждому запросу, динамического поколения SQL на каждом запросе... все эти вещи могут оказать влияние, но использование инструмента ORM может решительно увеличить питание, доступное Вам с намного меньшим объемом кода, чем создание Вашего собственного уровня DB с ручными запросами.

Gary Richardson абсолютно прав, хотя, если Вы собираетесь продолжить использовать SQL в своем коде, необходимо всегда использовать подготовленные операторы PDO для обработки параметров независимо от того, используете ли Вы запрос или хранимую процедуру. Санитизация входа выполняется для Вас PDO.

// optional
$attrs = array(PDO::ATTR_PERSISTENT => true);

// create the PDO object
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass", $attrs);

// also optional, but it makes PDO raise exceptions instead of 
// PHP errors which are far more useful for debugging
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare('INSERT INTO venue(venueName, regionId) VALUES(:venueName, :regionId)');
$stmt->bindValue(":venueName", "test");
$stmt->bindValue(":regionId", 1);

$stmt->execute();

$lastInsertId = $pdo->lastInsertId();
var_dump($lastInsertId);

Протест: предполагая, что идентификатор равняется 1, вышеупомянутый сценарий произведет string(1) "1". PDO->lastInsertId() возвраты идентификатор как строка независимо от того, является ли фактический столбец целым числом или нет. Это, вероятно, никогда не будет проблемой для Вас, поскольку PHP выполняет кастинг строк к целым числам автоматически.

следующее произведет bool(true):

// regular equality test
var_dump($lastInsertId == 1); 

, но если у Вас есть код, который ожидает, что значение будет целым числом, как [1 113], is_int или PHP's "действительно, действительно, на 100% равен" оператор:

var_dump(is_int($lastInsertId));
var_dump($lastInsertId === 1);

Вы могли столкнуться с некоторыми проблемами.

Редактирование: Некоторое хорошее обсуждение хранимых процедур здесь

29
ответ дан 1 December 2019 в 06:40
поделиться

Мы были в подобном затруднительном положении когда-то. Мы запросили определенную таблицу во множестве путей, более чем 50 +.

то, Что мы закончили тем, что делали, создавало единственную хранимую процедуру Выборки, которая включает значение параметра для WhereClause. WhereClause был создан в объекте Поставщика, мы использовали шаблон разработки Фасада, где мы могли куст он для любых атак с использованием кода на SQL.

Поэтому насколько обслуживание идет, легко изменить. SQL Server также вполне приятель и кэширует планы выполнения динамических запросов так, общая производительность довольно хороша.

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

2
ответ дан 1 December 2019 в 06:40
поделиться

Этот другой вопрос также имеет некоторые полезные ссылки в нем...

0
ответ дан 1 December 2019 в 06:40
поделиться

Я переместил бы весь SQL в отдельный модуль Perl (.pm), Много запросов могли снова использовать те же функции с немного отличающимися параметрами.

частая ошибка А для разработчиков состоит в том, чтобы погрузиться в библиотеки ORM, параметризованные запросы и хранимые процедуры. Мы затем работаем в течение многих месяцев подряд для создания кода "лучше", но это только "лучше" в способе разработки. Вы не делаете новых возможностей!

сложность Использования в Вашем коде только для обращения к клиентским потребностям.

3
ответ дан 1 December 2019 в 06:40
поделиться

Существуют некоторые библиотеки, такие как MDB2 в ГРУШЕ, которые делают запросы немного легче и более безопасного.

, К сожалению, они могут быть немного многословными для установки, и иногда необходимо передавать их та же информация дважды. Я использовал MDB2 в нескольких проектах, и я был склонен писать тонкую фанеру вокруг этого, специально для определения типов полей. Я обычно делаю объект, который знает о конкретной таблице и ее столбцах, и затем функция помощника в этом заполняет типы поля для меня, когда я называю функцию запроса MDB2.

, Например:

function MakeTableTypes($TableName, $FieldNames)
{
    $Types = array();

    foreach ($FieldNames as $FieldName => $FieldValue)
    {
        $Types[] = $this->Tables[$TableName]['schema'][$FieldName]['type'];
    }

    return $Types;
}

, Очевидно, этот объект имеет карту имен таблиц-> схемы, которые он знает об и просто извлекает типы полей, которые Вы указываете, и возвращает массив типа соответствия, подходящий для использования с запросом MDB2.

MDB2 (и подобные библиотеки) затем обрабатывают замену параметра на Вас, таким образом, для обновления/запросов на вставку, Вы просто создаете хеш/карту из имени столбца, чтобы оценить и использовать 'автовыполнить' функции, чтобы создать и выполнить соответствующий запрос.

, Например:

function UpdateArticle($Article)
{
    $Types = $this->MakeTableTypes($table_name, $Article);

    $res = $this->MDB2->extended->autoExecute($table_name,
        $Article,
        MDB2_AUTOQUERY_UPDATE,
        'id = '.$this->MDB2->quote($Article['id'], 'integer'),
        $Types);
}

и MDB2 создаст запрос, выходя из всего правильно, и т.д.

я рекомендовал бы измерить уровень с MDB2, хотя, поскольку он вытягивает в небольшом количестве кода, который мог бы вызвать Вас проблемы, если Вы не выполняете акселератор PHP.

, Как я говорю, установка наверху кажется пугающей сначала, но после того как она сделала запросы, может быть более просты/больше символьный записи и (особенно) изменить. Я думаю, что MDB2 должен знать немного больше о Вашей схеме, которая была бы simpify некоторые наиболее часто используемые вызовы API, но можно уменьшить раздражение из-за этого путем инкапсуляции схемы сами, как я упомянул выше, и обеспечение простых функций средства доступа, которые генерируют массивы, MDB2 должен выполнить эти запросы.

, Конечно, можно просто сделать плоские SQL-запросы как строку с помощью запроса () функция, если Вы хотите, таким образом, Вы не вынуждены переключить в полной мере 'MDB2 путь' - можно испытать его по частям и видеть, ненавидите ли Вы его или нет.

1
ответ дан 1 December 2019 в 06:40
поделиться

Используйте пакет ORM, любая половина достойного пакета позволит, Вы к

  1. Добираетесь, простые наборы результатов
  2. Сохраняют Ваш сложный SQL близко к модели данных

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

2
ответ дан 1 December 2019 в 06:40
поделиться

Используйте платформу ORM как QCodo - можно легко отобразить существующую базу данных

0
ответ дан 1 December 2019 в 06:40
поделиться

Я пытаюсь использовать довольно родовые функции и просто передать различия в них. Таким образом, у Вас только есть одна функция для обработки большей части ВЫБОРА базы данных. Очевидно, можно создать другую функцию для обработки всех ВСТАВОК.

, например,

function getFromDB($table, $wherefield=null, $whereval=null, $orderby=null) {
    if($wherefield != null) { 
        $q = "SELECT * FROM $table WHERE $wherefield = '$whereval'"; 
    } else { 
        $q = "SELECT * FROM $table";
    }
    if($orderby != null) { 
        $q .= " ORDER BY ".$orderby; 
    }

    $result = mysql_query($q)) or die("ERROR: ".mysql_error());
    while($row = mysql_fetch_assoc($result)) {
        $records[] = $row;
    }
    return $records;
}

Это просто первое, что пришло на ум, но Вы получаете идею. Для использования его просто передают функцию необходимые параметры:

, например,

$blogposts = getFromDB('myblog', 'author', 'Lewis', 'date DESC');

В этом случае $blogposts будет массивом массивов, которые представляют каждую строку таблицы. Затем можно просто использовать foreach или обратиться к массиву непосредственно:

echo $blogposts[0]['title'];
0
ответ дан 1 December 2019 в 06:40
поделиться

Я должен был очистить проект, который много (дублирующихся/подобных) запросов пронизали инжекционными уязвимостями. Первые шаги, которые я сделал, использовали заполнителей и маркируют каждый запрос объектом/методом и исходной строкой, запрос был создан. (Вставьте PHP-константы МЕТОД и СТРОКА в строку комментария SQL)

Это выглядело примерно так:

- @Line:151 UserClass:: getuser ():

SELECT * FROM USERS;

Вход всех запросов в течение короткого времени предоставил меня некоторые начальные точки на который запросы объединиться. (И где!)

3
ответ дан 1 December 2019 в 06:40
поделиться

Сначала необходимо использовать заполнителей в запросе вместо того, чтобы интерполировать переменные непосредственно. PDO/MySQLi позволяют Вам писать свои запросы как:

SELECT * FROM sometable WHERE iUser = ?

API безопасно заменит значениями в запрос.

я также предпочитаю иметь свои запросы в коде вместо базы данных. Намного легче работать с RCS, когда запросы с Вашим кодом.

у меня есть эмпирическое правило при работе с ORM's: если я буду работать с одним объектом за один раз, то я буду использовать интерфейс. Если я сообщаю/работаю с записями в агрегате, я обычно пишу SQL-запросы, чтобы сделать это. Это означает, что в моем коде существует очень немного запросов.

4
ответ дан 1 December 2019 в 06:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: