PHP チュートリアル: MySQL データベースの操作と SQL ステートメントの実行

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;
?>

おすすめ

転載: blog.csdn.net/a772304419/article/details/133397562