サニタイズされた入力を渡すことができるストアド プロシージャを作成する必要があります (私の例を使用するには、データベース名や正しいユーザーなどの変数を変更してパスなどを実行する必要があります)。もちろんデータベース)
例:
<?php
$dsn = 'mysql:dbname=scratch;host=127.0.0.1';
$user = 'root';
$password = '';
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
$dbname = 'brand_new_db';
$statement = $dbh->prepare("CALL dbcreator(:db)");
$statement->bindParam(':db',$dbname);
if(!$statement->execute()){
print_r($statement->errorInfo());
}
else {
foreach( $dbh->query('SHOW DATABASES')->fetchAll() as $row){
print "$row[0]" . PHP_EOL;
}
}
ストアド プロシージャ:
DELIMITER $$
DROP PROCEDURE IF EXISTS `scratch`.`dbcreator` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `dbcreator`(IN dbname VARCHAR(64))
BEGIN
SET @db = dbname;
SET @statement = CONCAT('CREATE DATABASE ',@db);
PREPARE prepared_statement FROM @statement;
EXECUTE prepared_statement;
END $$
DELIMITER ;
私たちの場合、ステートメントは変数では機能しないため、 PREPAREにSQL ステートメントを作成し、それを単にEXECUTEします。最後に、ストアド プロシージャを実行します。それは、パラメータを使用してバインドできることです。CREATE DATABASE <our database>;
CREATE DATABASE
CALL dbcreator('<dbname>')
CALL dbcreator(:dbname)
ご覧のとおり、この方法では、データベースの作成中に pdo を介して安全にパラメーターをバインドできます。それでも、検索と識別を容易にするために、作成するすべてのデータベースに短い固定文字列をプレフィックスとして付けることは悪い考えではないかもしれません。ストアド プロシージャでは、dbname は64 文字に制限されています。これが mysql の現在の制限であるためです。