PHP PDO с большими таблицами

#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 /

  1. не зависит от базы данных — это означает, что он поддерживает MySQL, PostgreSQL, SQLite, Microsoft SQL Server.
  2. вы можете просто перенести это в новый проект
  3. им проще управлять в командах

Теперь на основе вашего примера и взято из документации 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();
        }
    }