Php 数据未插入MySQL数据库
我使用的是PHP和PDO,问题是当我单击submit按钮时,数据没有插入数据库。根本没有错误,我不确定是什么原因造成的。我尝试了很多方法,但仍然无法找到解决方案 这是我的代码:Php 数据未插入MySQL数据库,php,mysql,Php,Mysql,我使用的是PHP和PDO,问题是当我单击submit按钮时,数据没有插入数据库。根本没有错误,我不确定是什么原因造成的。我尝试了很多方法,但仍然无法找到解决方案 这是我的代码: <?php function cl($info){ return preg_replace("|[^\w]|", "", $info);
<?php
function cl($info){
return preg_replace("|[^\w]|", "", $info);
}
function cl2($info){
return preg_replace("|[^\w]|", "", $info);
}
function check_email($email){
$exit = FALSE;
if(filter_var($email, FILTER_VALIDATE_EMAIL)){
return $exit = TRUE;
}
else {
return $exit;
}
}
if (isset($_POST['register'])) {
$errors = [];
$username = cl($_POST['username'] ?? '');
$password = cl2($_POST['password'] ?? '');
$email = $_POST['email'] ?? '';
try {
$conn = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS);
} catch (PDOException $e) {
echo "Failed to get DB handle: " . $e->getMessage() . "\n";
exit;
}
$check_username = $conn->prepare("SELECT * FROM accounts WHERE name = :username");
$check_username->bindParam(':username', $username, PDO::PARAM_STR);
$check_username->execute();
if($check_username->rowCount()) {
array_push($errors, 'Username already in use, please select a new one.');
} else if(empty($username) || strlen($username) < 4 || strlen($username) > 13) {
array_push($errors, 'Invalid username, please select another one.');
} else if(empty($password) || strlen($password) < 4 || strlen($password) > 20) {
array_push($errors, 'Invalid password, please select another one.');
} else if(empty($email) || !check_email($_POST['email'])) {
array_push($errors, 'Invalid password, please select another one.');
}
if(empty($errors)) {
$query = $conn->prepare("INSERT INTO accounts (name,password,email) VALUES ($username,$password,$email)");
$query->bindParam(':username', $username, PDO::PARAM_STR);
$query->bindParam(':password', $password, PDO::PARAM_STR);
$query->bindParam(':email', $email, PDO::PARAM_STR);
$query->execute();
echo '<br />';
echo ' <div class="alert alert-success text-center" role="alert">
Account created succesfully.
</div>';
} else {
foreach($errors as $error) {
echo '<br />';
echo '<div class="alert alert-danger text-center" role="alert">';
echo $error;
echo '</div>';
}
}
}
?>
我得到以下错误:
Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.accounts' doesn't exist
但是该表存在于我的数据库中。这太奇怪了。从我看来,这句话是错的
$query = $conn->prepare("INSERT INTO accounts (name,password,email) VALUES ($username,$password,$email)");
应该是
$query = $conn->prepare("INSERT INTO accounts (name,password,email) VALUES (:username,:password,:email)");
我认为如果你在变量周围加上引号,它会起作用,但是你看起来想正确地阻止sql注入。你使用和应该使用它应该没有关系,因为我没有在PHP脚本中添加值,所以它目前没有被使用。或者我错了?好的,但您总是使用id,所以您不会检索这些值。当您访问数据库时,请从帐户中选择*,其中name=:username您将无法检索任何内容,因为username为空。这是什么意思?我在标记中使用了“名称”。对不起,你是对的,我的错误。我用bindParam和现在都试过了。他们没有一个人在工作。不知道是什么引起的。当我尝试使用$query=$conn->prepare(“插入帐户(名称、密码、电子邮件)值(:用户名、密码、电子邮件)”时;一切都对我有用!!如果没有表帐户,代码不会给出任何消息,它也会给出空($errors),并显示成功创建的消息帐户。但由于表帐户不存在,因此未进行插入。您确定该表存在吗?@Alessandro如果您调用,它可能会为您提供有关查询中发生的任何事情的更多信息,例如
var_dump($conn->errorInfo())代码>
$query = $conn->prepare("INSERT INTO accounts (name,password,email) VALUES ($username,$password,$email)");
$query = $conn->prepare("INSERT INTO accounts (name,password,email) VALUES (:username,:password,:email)");