Есть ли лучший, более стандартный способ выполнения SQL-запросов в PHP без использования фреймворка?

В течение самого долгого времени я использовал следующее базовое форматирование для SQL-запросов в моем PHP:

$sql = "SELECT * FROM `user-data` WHERE `id` = '".$id."' LIMIT 1;"; $fn = mysql_fetch_assoc(mysql_query($sql)); 

Хотя это работает безупречно, оно может стать действительно беспорядочным для более длинных фрагментов кода, и что-то глубоко внутри моей совести сжимается при конкатенации строк каждый раз, когда я это делаю. Тем не менее, он работает, и я использую его почти везде без серьезных проблем. (Это ручный пример, я недостаточно плотный, чтобы передавать пользовательские данные непосредственно в строку SQL, не избегая его в первую очередь и т. Д.).

То, что я хотел бы сделать, это нечто большее, чем объектно-ориентированное, но я не уверен, каким будет лучший подход. Было бы неплохо иметь возможность sql-> insert ($ values ​​[, $ where, $ extra]); или что-то подобное, используя естественные типы ассоциативных массивов PHP для более простой передачи строк запроса. Менее гибкая? Да. Более читабельны? Черт, да, и сложнее сделать «тихие» синтаксические ошибки.

Что такое сообщество принимает на себя? Какие подходы вы видели в этой проблеме, которые были наиболее эффективными для проектов, над которыми вы работали?

Не то, чтобы это важно, но я лично не делаю намного сложнее, чем SELECT, INSERT и UPDATE, со случайным вложением подзапросов, но это в основном потому, что мой SQL-вкус не хранит процедуры.

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

Может быть, это сделало бы вас немного счастливее, по крайней мере, для замены строковой переменной PHP:

 $sql = "SELECT * FROM `user-data` WHERE `id` = '$id' LIMIT 1;"; 

Существует MDB_QueryTool, который я никогда не пробовал.

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

то, что мне нравится в Zend_DB, является синтаксис выбора таблицы

 $userRowset = $user->fetchAll( $user->select() ->where('name LIKE ?', $name . '%') ->order('id ASC') ->limit(10) ); 

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

Доктрина – это ORM, обернутая PDO .

Еще одно голосование за доктрину . Не тратьте время на PDO. Я не могу это подчеркнуть. Пойдите с ормом. Забудьте о том, как тратить время на использование методов CRUD, пользовательскую логику кэширования и беспокоиться о преждевременной оптимизации, такой как «накладные расходы», возникающие из библиотеки. Накладные расходы, вызванные заявлениями о разбрызгивании, такие как «select * from app_users» и связанные с ними уродливые heredocs, не стоят.

Если вам нужно вернуться к sql, вы можете. Другие 90% времени вы находитесь в состоянии блаженства.

http://www.doctrine-project.org/

Вы можете использовать mysqli для написания небольших держателей мест в вашем SQL и затем заполнить их. Он должен быть менее восприимчивым к атакам SQL-инъекций, чем конкатенация строк.

 $conn = new mysqli($server, $username, $password, $database); $stmt = $conn->prepare('SELECT * FROM people WHERE age = ? AND name != ?'); $stmt->bind_param('is', 20, "Austin"); 

Пытаться:

 $stat2 = <<<SQL SELECT * from YOUR.DET_TABLE WHERE ID = ? ORDER BY ID, EFF_DT SQL; $d_cur = $conn->prepare($stat2); $status = $d_cur->execute(array($selected)); 

Мне было интересно, почему я всегда вижу более сложную форму построения струн вроде этого: «буквальная строка». $ a. «более буквальный», а не «буквальная строка $ более буквальный» или в вашем случае:

 "SELECT * FROM `user-data` WHERE `id` = '".$id."' LIMIT 1;"; 

вместо этого:

 "SELECT * FROM `user-data` WHERE `id` = '$id' LIMIT 1;"; 

Для более сложных выражений мне нравится использовать sprintf (но я был программистом в течение длительного времени):

 $sql = sprintf("SELECT * FROM `user-data` WHERE `id` = '%s' LIMIT 1", $id); 

Это также можно записать в таком формате:

 $sql = sprintf(" SELECT * FROM `user-data` WHERE `id` = '%s' LIMIT 1", $id); 

В этом случае он не покупает много, но когда в строке встроено несколько переменных, это упрощает управление.