以下代码完全符合预期。它成功地将客户端添加到数据库中。但我从未告诉查询执行或添加新客户端我所做的只是将查询存储在变量中并检查它是否在if语句中有效。我需要一些帮助来理解查询是如何执行的。
$query = "INSERT INTO clients(id, name, email, phone, address, company, notes, date_added) VALUES(NULL, '$clientName', '$clientEmail', '$clientPhone', '$clientAddress', '$clientCompany', '$clientNotes', CURRENT_TIMESTAMP)";
$result = mysqli_query($connection, $query);
// if query was successful
if( $result ){
header("LOCATION: clients.php?update=success");
} else{
// something went wrong
echo "Error: $query <br>" . mysqli_error($connection);
}
答案 0 :(得分:2)
你应该这样做的方式更加不言自明:
// Prepare this query with placeholders for where the user data will go.
// This creates a prepared statement handle ($stmt)
$stmt = $connection->prepare("INSERT INTO clients(name, email, phone, address, company, notes, date_added)
VALUES(?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)");
// Bind the user data to the statement so it will be escaped properly
// and inserted correctly.
$stmt->bind_param(
"ssssss",
$clientName,
$clientEmail,
$clientPhone,
$clientAddress,
$clientCompany,
$clientNotes
);
// Execute the statement now that everthing is in place. This actually
// sends the query to the MySQL server to be executed and waits
// for the result. The result of this function call indicates success
// or failure.
if ($stmt->execute()) {
// Query was successful then `execute()` returns a logically true value
// and this block of code will run.
header("Location: clients.php?update=success");
} else {
// If that previous condition didn't trigger, then we end up here and
// this code will run instead.
echo "Error: $query <br>" . $connection->error;
}
如果您的AUTO_INCREMENT
列没有在VALUES
列表中指定,则可以省略它,它会自动填充。任何默认为NULL
的列也可以省略。强制插入NULL
是没有意义的,如果它最终会如何结束。
您还需要特别注意插入数据的方式。你不能使用字符串插值来做到这一点,它是extremely dangerous。如果您创建了具有占位符值(?
)的预准备语句,bind_param
方法将以安全的方式处理数据添加。这几乎可以保证您的代码安全,安全,并且可以避免错误,这些错误可能需要花费大量时间来识别和修复。
我也将其切换为使用面向对象的mysqli
样式。这不仅非常简洁,而且对于正在执行的操作也变得更加清楚。 $stmt->function()
显然是利用或操纵$stmt
对象的东西。如果这只是许多人的一个论点,那么很难确定。
直接为函数指定参数而不是依赖于这些中间变量也是一个很好的习惯。像$sql
这样的事情往往会使你的代码混乱并混淆那个字符串的意图,而且如果你有几个你正在玩杂耍,比如$sql3
和$sql8
就有机会制作一个导致实际问题的小错字。