Borang pendaftaran nama syarikat
P粉904191507
2023-09-05 19:05:36
<p>Untuk rujukan sahaja, baharu dalam pengekodan, belajar sendiri, berehat...</p>
<p>Saya mempunyai borang pendaftaran yang mencipta jadual SQL baharu. Nama syarikat yang mereka masukkan akan menjadi nama jadual baharu yang dibuat setiap kali mereka log masuk. </p>
<p>Semuanya berfungsi dengan baik kecuali untuk kelemahan dalam pembolehubah nama jadual. </p>
<p>Saya menggunakan PHP dan MySQL. </p>
<p>Saya pada mulanya menghadapi masalah jika nama syarikat mempunyai ruang antara 2 perkataan, tetapi saya membetulkannya menggunakan str_replace</p>
<p>Saya melakukan banyak ujian dan mendapati bahawa jika saya meletakkan nama syarikat dalam "keluar" ia melanggar kod. </p>
<p>Saya menerima mesej ralat ini: </p>
<p>"Ralat maut: Uncaught mysqli_sql_exception: Terdapat ralat dalam sintaks SQL anda; semak manual untuk versi pelayan MySQL anda untuk sintaks yang betul untuk digunakan berhampiran 'out (id INT UNSIGNED AUTO_INCRMENT PRIMARY KEY, first_name VARCHAR(128 ) BUKAN ' Susunan tindanan pada baris 1 dalam C:Usersreece.groverOneDriveXML Websiteopregister.php:73: #0 C:Usersreece.groverOneDriveXML Websiteopregister.php(73): mysqli->query('CREATE JADUAL ou ...') #1 {main} membuang "</p> dalam C:Usersreece.groverOneDriveXML Websiteoregister.php pada baris 73
<p>Ini nampaknya membawa bukan sahaja kepada ralat, tetapi juga kepada suntikan SQL. </p>
<p>Saya belajar bagaimana untuk mengikat_param, tetapi ini masih menghalang kemungkinan pecah kod daripada fungsi CREATE TABLE. </p>
<p>Ini ialah kod PHP sebelah pelayan saya, borang itu hanyalah bentuk HTML ringkas dengan Bootstrap.</p>
<pre class="brush:php;toolbar:false;">//alih keluar ruang
$company = str_replace(' ', '', $_POST["syarikat"]);
//hash Kata laluan
$password_hash = password_hash($_POST["password"], PASSWORD_DEFAULT);
// Cipta Operator baharu
$mysql = memerlukan __DIR__ . "/database.php";
$sql = "MASUKKAN KE DALAM operator (nama_pertama, nama_akhir, e-mel, cincangan_kata laluan, syarikat)
NILAI (?, ?, ?, ?, ?)";
$stmt = $mysql->stmt_init();
if ( ! $stmt ->prepare($sql)){
die("SQL error: " . $mysql->error);
}
$stmt->bind_param("sssss",
$_POST["nama_pertama"],
$_POST["nama_akhir"],
$_POST["e-mel"],
$password_hash,
$syarikat);
if ( ! $stmt->execute()) {
die($mysqli->error . " " . $mysqli->errno);
}
//Buat jadual syarikat baharu
$sql = "BUAT JADUAL $syarikat (
id INT UNSIGNED AUTO_INCREMENT KUNCI UTAMA,
nama_pertama VARCHAR(128) BUKAN NULL,
nama akhir VARCHAR(128) BUKAN NULL,
e-mel VARCHAR(255) BUKAN NULL UNIK,
syarikat VARCHAR(128),
kredit VARCHAR(60),
telefon VARCHAR(60))";
if ( ! $mysql->query($sql)) {
die("Buat Jadual Gagal : " . $mysql->error);
}
$sql = "MASUKKAN KE DALAM $syarikat (nama_pertama, nama_akhir, e-mel, syarikat, kredit, telefon)
NILAI (?, ?, ?, ?, ?, ?)";
$stmt = $mysql->stmt_init();
if ( ! $stmt ->prepare($sql)){
die("SQL error: " . $mysql->error);
}
$stmt->bind_param("ssssss",
$_POST["nama_pertama"],
$_POST["nama_akhir"],
$_POST["e-mel"],
$syarikat,
$_POST["kredit"],
$_POST["telefon"]);
if ($stmt->execute()) {
header("Lokasi: signup_success.php");
keluar;</pre></p>
Anda harus mempunyai jadual syarikat yang dipratentukan dan bukannya jadual nama_syarikat yang berasingan. Anda juga tidak seharusnya membuat jadual berdasarkan input pengguna.
Pracipta jadual syarikat:
Anda kemudian boleh
INSERT
data anda ke dalam jadual ini:Setiap syarikat dimasukkan ke dalam jadual ini. Mereka dibezakan oleh lajur
id
.Anda juga boleh menambah kekangan kunci asing pada
operators
jadual.Jika anda mahu data syarikat anda dipadamkan apabila anda memadam pengendali, anda boleh lakukan
DELETE CASCADE
: