PHP-MySQL操作データベースディレクトリ
単一の SQL ステートメントを実行するディレクトリ
MySQLiディレクトリ
# 面对对象
$sql = "CREATE DATABASE myDB";
if ($conn->query($sql) === TRUE) {
echo "数据库创建成功";
} else {
echo "Error creating database: " . $conn->error;
}
# 面对过程
$sql = "CREATE DATABASE myDB"; # 设置操作数据库操作命令
if (mysqli_query($conn, $sql)) {
echo "数据库创建成功";
} else {
echo "Error creating database: " . mysqli_error($conn);
}
PDOディレクトリ
try {
$conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
// 设置 PDO 错误模式为异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "CREATE DATABASE myDBPDO"; # 设置操作数据库操作命令
// 使用 exec() ,因为没有结果返回
$conn->exec($sql);
echo "数据库创建成功<br>";
}
MySQL 操作コマンドの詳細については、「SQL Getting Started Notes」を参照してください。
複数のSQL文を実行するディレクトリ
共通メソッドディレクトリ
- MySQLi
mysqli_multi_query() 関数を使用すると、複数の SQL ステートメントを実行できます。
# 面对对象
$conn->multi_query($sql)
# 面对过程
mysqli_multi_query($conn, $sql)
- PDO
// 开始事务
$conn->beginTransaction();
// SQL 语句
$conn->exec("INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', '[email protected]')");
$conn->exec("INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Mary', 'Moe', '[email protected]')");
$conn->exec("INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Julie', 'Dooley', '[email protected]')");
// 提交事务
$conn->commit();
プリペアドステートメントディレクトリの使用
プリペアド ステートメントは、MySQL インジェクションを防ぐのに非常に役立ちます。
準備されたステートメントは、複数の同一の SQL ステートメントをより効率的に実行するために使用されます。
準備されたステートメントは次のように機能します。
- 前処理: SQL ステートメントのテンプレートを作成し、データベースに送信します。予約された値にはパラメータ「?」が付けられます。
INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
- データベースの解析、コンパイル、SQL ステートメント テンプレートでのクエリの最適化、および出力なしの結果の保存。
- 実行: 最後に、アプリケーションにバインドされた値がパラメータ (「?」マーク) に渡され、データベースがステートメントを実行します。パラメータ値が異なる場合、アプリケーションはステートメントを複数回実行できます。
SQL ステートメントを直接実行する場合と比較して、プリペアド ステートメントには次の 2 つの主な利点があります。
- プリペアド ステートメントを使用すると、(ステートメントは複数回実行されますが) クエリが 1 つだけ作成されるため、分析時間が大幅に短縮されます。
- パラメーターをバインドするとサーバーの帯域幅が削減され、ステートメント全体ではなくクエリのパラメーターのみを送信する必要があります。
- プリペアド ステートメントは、パラメーター値の送信後にさまざまなプロトコルが使用され、データの有効性が保証されるため、SQL インジェクションに非常に役立ちます。
MySQLiディレクトリ
$sql = "INSERT INTO MyGuests(firstname, lastname, email) VALUES(?, ?, ?)";
// 为 mysqli_stmt_prepare() 初始化 statement 对象
$stmt = mysqli_stmt_init($conn);
//预处理语句
if (mysqli_stmt_prepare($stmt, $sql)) {
// 绑定参数
mysqli_stmt_bind_param($stmt, 'sss', $firstname, $lastname, $email);
// 设置参数并执行
$firstname = 'John';
$lastname = 'Doe';
$email = '[email protected]';
mysqli_stmt_execute($stmt);
$firstname = 'Mary';
$lastname = 'Moe';
$email = '[email protected]';
mysqli_stmt_execute($stmt);
$firstname = 'Julie';
$lastname = 'Dooley';
$email = '[email protected]';
mysqli_stmt_execute($stmt);
$stmt->close();
$conn->close();
}
前処理とバインディングを記述する別の方法:
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
パラメータのバインドに注意する
mysqli_stmt_bind_param($stmt, 'sss', $firstname, $lastname, $email);
この関数はパラメータ クエリをバインドし、パラメータをデータベースに渡します。2 番目のパラメータは「sss」で、パラメータのタイプを示します。
- i - 整数
- d - 倍精度浮動小数点数
- s - 文字列
- b - ブール値
データのセキュリティを確保するには、各パラメータでタイプを指定する必要があります。型判定により、SQL インジェクションの脆弱性のリスクを軽減できます。
PDOディレクトリ
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// 设置 PDO 错误模式为异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 预处理 SQL 并绑定参数
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);
// 插入行
$firstname = "John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();
// 插入其他行
$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();
// 插入其他行
$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();
echo "新记录插入成功";
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>