#php #pdo
#php #pdo
Вопрос:
Я часто создаю таблицы со многими столбцами. Я хотел бы иметь более быстрый способ подготовки запросов в PHP с использованием PDO. Приведенный ниже код работает должным образом, но я не уверен, что это подходящий способ для решения этой задачи. Пожалуйста, посоветуйте.
//Define table name. Hardcoded and does not rely on user input.
$TableName = "...";
//Define table fields. These are all hardcoded into the PHP code and does not rely on any user input.
$Fields = array("Field 1", "Field 2", ... , "Field 20");
//Establish PDO connection
$conn = new PDO("...");
//Automatically prepare statement INSERT query.
$stmt = $conn->prepare("INSERT INTO " .$TableName." (".implode(',',$Fields).") VALUES (:". implode(',:',$Fields) .");");
//Automatically bind post variables and sanitize using a self-defined function.
foreach ($Fields as $Value):
$stmt->bindValue(':'.$Value, sanitizeString($_POST[$Value]));
endforeach;
//Execute Query
$stmt->execute();
Комментарии:
1. В PDO запросы подготавливаются только один раз и отправляются в MySQL. Таким образом, он оптимизирован и не является узким местом. Кроме того, вы можете захотеть изучить массовую вставку, а не вставку по строкам.
2. Это настолько уместно, насколько это возможно, учитывая то, как вы свободно определяете столбцы таблицы. Я предпочитаю более жесткий подход, чтобы, глядя на код, вы точно знали, с какой таблицей и какими полями выполняются манипуляции… но это чисто объективно и основано на мнениях; как и в большинстве случаев, я хочу «очистить» только определенные поля, а не каждое из них по одним и тем же правилам. Например, я никогда не изменяю поле пароля, но я всегда
trim
указываю имя пользователя и т.д.
Ответ №1:
Для создания таблиц и заполнения их данными я бы предложил database migration manager.
Что-то вроде https://phinx.org /
- не зависит от базы данных — это означает, что он поддерживает MySQL, PostgreSQL, SQLite, Microsoft SQL Server.
- вы можете просто перенести это в новый проект
- им проще управлять в командах
Теперь на основе вашего примера и взято из документации https://book.cakephp.org/phinx
a) Создать таблицу — https://book.cakephp.org/phinx/0/en/migrations.html
просто в командной строке vendor/bin/phinx create MyNewMigration
use PhinxMigrationAbstractMigration;
class MyNewMigration extends AbstractMigration
{
public function up()
{
$table = $this->table('followers', ['id' => 'user_id']);
$table->addColumn('follower_id', 'integer')
->addColumn('created', 'timestamp', ['default' => 'CURRENT_TIMESTAMP'])
->create();
}
}
б) заполнить данными — https://book.cakephp.org/phinx/0/en/seeding.html
php vendor/bin/phinx seed:create UserSeeder
use PhinxSeedAbstractSeed;
class PostsSeeder extends AbstractSeed
{
public function run()
{
$data = [
[
'body' => 'foo',
'created' => date('Y-m-d H:i:s'),
],[
'body' => 'bar',
'created' => date('Y-m-d H:i:s'),
]
];
$posts = $this->table('posts');
$posts->insert($data)
->saveData();
}
}