bạn sẽ cần phải viết stored procedure mà sau đó bạn có thể chuyển đầu vào đã được vệ sinh (để sử dụng ví dụ của mình, bạn cần phải thay đổi một số biến như tên cơ sở dữ liệu và người dùng và thông tin chính xác) nó chạy trên cơ sở dữ liệu của bạn tất nhiên)
dụ:
<?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;
}
}
thủ tục lưu trữ:
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 ;
Y tạo một câu lệnh SQL tới PREPARE, trong trường hợp của chúng tôi CREATE DATABASE <our database>;
vì câu lệnh CREATE DATABASE
sẽ không hoạt động với một biến, và sau đó bạn chỉ cần EXECUTE nó. Cuối cùng, bạn thực hiện CALL dbcreator('<dbname>')
để thực hiện quy trình được lưu trữ. Đó là CALL dbcreator(:dbname)
, bạn có thể sử dụng và ràng buộc các tham số.
Như bạn có thể thấy, bằng cách này bạn vẫn có thể ràng buộc các thông số của mình một cách an toàn thông qua pdo trong khi tạo cơ sở dữ liệu. Tuy nhiên, có thể không phải là một ý tưởng tồi để tạo tiền tố cho tất cả cơ sở dữ liệu bạn tạo bằng một chuỗi cố định ngắn để dễ dàng tra cứu và phân biệt đối xử. Trong dbname thủ tục lưu sẵn là limited to 64 characters vì đó là giới hạn hiện tại của mysql
Nguồn
2012-06-17 00:23:48
Danh sách trắng có lẽ là cách tốt nhất để đi - cũng như một số công cụ lưu trữ mySQL sẽ tạo các thư mục và tệp chứa tên cơ sở dữ liệu. –