Php MySQL:如果插入值不唯一,则返回错误
如果firstname和last name的组合已经在Student表中,我希望在addStudent.php页面上输出一个错误。目前,它只是不向表中添加非唯一的条目,但不通知用户该条目已经存在 表格结构:Php MySQL:如果插入值不唯一,则返回错误,php,html,mysql,Php,Html,Mysql,如果firstname和last name的组合已经在Student表中,我希望在addStudent.php页面上输出一个错误。目前,它只是不向表中添加非唯一的条目,但不通知用户该条目已经存在 表格结构: <?php include 'connect.php'; // sql to create table $sql = "CREATE TABLE IF NOT EXISTS student ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY
<?php
include 'connect.php';
// sql to create table
$sql = "CREATE TABLE IF NOT EXISTS student (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
fname VARCHAR(30),
lname VARCHAR(30),
mclass VARCHAR(30),
aclass VARCHAR(30),
UNIQUE (`fname`, `lname`)
)";
if ($conn->query($sql) === TRUE) {
} else {
echo "Error creating table: " . $conn->error;
}
$conn->close();
?>
addStudent.php
<fieldset>
<legend><h2> Details </h2></legend>
<form class="pure-form">
<label>First Name </label><input type="text" id="firstname" name = "firstname" autofocus=""><br><br>
<label>Last Name </label><input type="text" id="lastname" name = "lastname"><br><br>
</form>
</fieldset>
<br>
<fieldset>
<legend><h2>Classes</h2></legend>
<form class="pure-form">
<label>Morning Class </label>
<select id = "morningclass" name="morningclass">
<option value=""> </option>
<option value="G1F">G1-F</option>
<option value="G1S">G1-S</option>
<option value="G2J">G2-J</option>
<option value="G2A">G2-A</option>
<option value="G3">G3</option>
<option value="G4">G4</option>
<option value="G5">G5</option>
</select>
<br> <br>
<label>Afternoon Class </label>
<select id = "afternoonclass" name = "afternoonclass">
<option value=""> </option>
<option value="7P">7P</option>
<option value="7H">7H</option>
<option value="8P">8P</option>
<option value="8H">8H</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
</select>
<br> <br>
</form>
</fieldset>
<br>
<div class="buttonAlign">
<input type="button" value="Cancel" onclick="cancel();" class="button-error pure-button">
<input type="button" value="Add" id="button" class="button-secondary pure-button">
</div>
<br>
</body>
</div >
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
$(document).ready(function(){
$("#button").click(function(){
var fname=$("#firstname").val();
var lname=$("#lastname").val();
var mclass=$("#morningclass").val();
var aclass=$("#afternoonclass").val();
if (fname !== "" && lname !== "" && mclass !== "" && aclass !== "") {
$.ajax({
type:"post",
url:"add.php",
data:"firstname="+fname+"&lastname="+lname+"&morningclass="+mclass+"&afternoonclass="+aclass,
success:function(){
alert("Entry added");
window.location.href = "viewStudent.php";
}
});
document.getElementById("firstname").value = "";
document.getElementById("lastname").value = "";
document.getElementById("morningclass").value = "";
document.getElementById("afternoonclass").value = "";
} else {
alert("You must fill out all the empty information!");
}
});
});
function cancel() {
window.location.href = "viewStudent.php";
}
</script>
<?php
include 'connect.php';
$fname=preg_replace('/[^a-z]/', "", strtolower($_POST["firstname"]));
$lname=preg_replace('/[^a-z]/', "", strtolower($_POST["lastname"]));
$mclass=$_POST["morningclass"];
$aclass=$_POST["afternoonclass"];
$sql=("INSERT INTO student(fname,lname,mclass,aclass) values('$fname','$lname','$mclass','$aclass')");
if ($conn->query($sql) === TRUE) {
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>
细节
名字
姓氏
班级
早课
G1-F
G1-S
G2-J
G2-A
G3
G4
G5
下午课
7便士
7小时
8P
8H
9
10
11
$(文档).ready(函数(){
$(“#按钮”)。单击(函数(){
var fname=$(“#firstname”).val();
var lname=$(“#lastname”).val();
var mclass=$(“#morningclass”).val();
var aclass=$(“#午后类”).val();
如果(fname!==“”&&lname!==“”&&mclass!==“”&&aclass!==“”){
$.ajax({
类型:“post”,
url:“add.php”,
数据:“firstname=“+fname+”&lastname=“+lname+”&morningclass=“+McClass+”&afternoonclass=“+aclass,
成功:函数(){
警报(“添加条目”);
window.location.href=“viewstuden.php”;
}
});
document.getElementById(“firstname”).value=“”;
document.getElementById(“lastname”).value=“”;
document.getElementById(“morningclass”).value=“”;
document.getElementById(“午后类”).value=“”;
}否则{
警告(“您必须填写所有空信息!”);
}
});
});
函数cancel(){
window.location.href=“viewstuden.php”;
}
add.php
<fieldset>
<legend><h2> Details </h2></legend>
<form class="pure-form">
<label>First Name </label><input type="text" id="firstname" name = "firstname" autofocus=""><br><br>
<label>Last Name </label><input type="text" id="lastname" name = "lastname"><br><br>
</form>
</fieldset>
<br>
<fieldset>
<legend><h2>Classes</h2></legend>
<form class="pure-form">
<label>Morning Class </label>
<select id = "morningclass" name="morningclass">
<option value=""> </option>
<option value="G1F">G1-F</option>
<option value="G1S">G1-S</option>
<option value="G2J">G2-J</option>
<option value="G2A">G2-A</option>
<option value="G3">G3</option>
<option value="G4">G4</option>
<option value="G5">G5</option>
</select>
<br> <br>
<label>Afternoon Class </label>
<select id = "afternoonclass" name = "afternoonclass">
<option value=""> </option>
<option value="7P">7P</option>
<option value="7H">7H</option>
<option value="8P">8P</option>
<option value="8H">8H</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
</select>
<br> <br>
</form>
</fieldset>
<br>
<div class="buttonAlign">
<input type="button" value="Cancel" onclick="cancel();" class="button-error pure-button">
<input type="button" value="Add" id="button" class="button-secondary pure-button">
</div>
<br>
</body>
</div >
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
$(document).ready(function(){
$("#button").click(function(){
var fname=$("#firstname").val();
var lname=$("#lastname").val();
var mclass=$("#morningclass").val();
var aclass=$("#afternoonclass").val();
if (fname !== "" && lname !== "" && mclass !== "" && aclass !== "") {
$.ajax({
type:"post",
url:"add.php",
data:"firstname="+fname+"&lastname="+lname+"&morningclass="+mclass+"&afternoonclass="+aclass,
success:function(){
alert("Entry added");
window.location.href = "viewStudent.php";
}
});
document.getElementById("firstname").value = "";
document.getElementById("lastname").value = "";
document.getElementById("morningclass").value = "";
document.getElementById("afternoonclass").value = "";
} else {
alert("You must fill out all the empty information!");
}
});
});
function cancel() {
window.location.href = "viewStudent.php";
}
</script>
<?php
include 'connect.php';
$fname=preg_replace('/[^a-z]/', "", strtolower($_POST["firstname"]));
$lname=preg_replace('/[^a-z]/', "", strtolower($_POST["lastname"]));
$mclass=$_POST["morningclass"];
$aclass=$_POST["afternoonclass"];
$sql=("INSERT INTO student(fname,lname,mclass,aclass) values('$fname','$lname','$mclass','$aclass')");
if ($conn->query($sql) === TRUE) {
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>
而不是通过php分别调用select和update语句,存储过程将在服务器上完成大量工作。使用这种方法,您不需要向不同的页面发送多个帖子
basic sql stored procedure
--------------------------
create procedure `spAddUser`(IN `param_forename` VARCHAR(64), IN `param_surname` VARCHAR(64) )
language sql
not deterministic
contains sql
sql security definer
comment ''
begin
declare dbrecords integer default 0;
declare strsql varchar(10000);
declare forename varchar(64);
declare surname varchar(64);
set @forename=cast(param_forename as char character set utf8);
set @surname=cast(param_surname as char character set utf8);
/* Does the user already exist? */
set @strsql=concat("select distinct count(*) into @dbrecords from `users` where `forename`=@forename and `surname`=@surname;");
prepare stmt from @strsql;
execute stmt;
deallocate prepare stmt;
if( @dbrecords > 0 ) then
/* user exists, return statement that tells of problem */
set @strsql=concat("select 'sorry, that combination of firstname and lastname already exists' as 'result'");
prepare stmt from @strsql;
execute stmt;
deallocate prepare stmt;
else
/* all good, add the record */
set @strsql=concat("insert into `users` set `forename`=@forename, `surname`=@surname;");
prepare stmt from @strsql;
execute stmt;
deallocate prepare stmt;
set @strsql=concat("select 'Thankyou, your details have been added to the database' as 'result'");
prepare stmt from @strsql;
execute stmt;
deallocate prepare stmt;
end if;
end
php
---
$sql="call `spAddUser`('$forename','$surname')";
$db->query( $sql ); //etc
与通过php分别调用select和update语句不同,存储过程将在服务器上完成大量工作
basic sql stored procedure
--------------------------
create procedure `spAddUser`(IN `param_forename` VARCHAR(64), IN `param_surname` VARCHAR(64) )
language sql
not deterministic
contains sql
sql security definer
comment ''
begin
declare dbrecords integer default 0;
declare strsql varchar(10000);
declare forename varchar(64);
declare surname varchar(64);
set @forename=cast(param_forename as char character set utf8);
set @surname=cast(param_surname as char character set utf8);
/* Does the user already exist? */
set @strsql=concat("select distinct count(*) into @dbrecords from `users` where `forename`=@forename and `surname`=@surname;");
prepare stmt from @strsql;
execute stmt;
deallocate prepare stmt;
if( @dbrecords > 0 ) then
/* user exists, return statement that tells of problem */
set @strsql=concat("select 'sorry, that combination of firstname and lastname already exists' as 'result'");
prepare stmt from @strsql;
execute stmt;
deallocate prepare stmt;
else
/* all good, add the record */
set @strsql=concat("insert into `users` set `forename`=@forename, `surname`=@surname;");
prepare stmt from @strsql;
execute stmt;
deallocate prepare stmt;
set @strsql=concat("select 'Thankyou, your details have been added to the database' as 'result'");
prepare stmt from @strsql;
execute stmt;
deallocate prepare stmt;
end if;
end
php
---
$sql="call `spAddUser`('$forename','$surname')";
$db->query( $sql ); //etc
您的代码基本上是正常的(除了SQL注入漏洞)。您所需要做的就是查看在尝试插入副本时返回的mysql错误信息,以确定是否遇到了唯一的约束冲突或其他问题
请参阅关于如何检测唯一约束冲突的另一个SO问题-您的代码基本上是正常的(除了SQL注入漏洞)。您所需要做的就是查看在尝试插入副本时返回的mysql错误信息,以确定是否遇到了唯一的约束冲突或其他问题
请参阅关于如何检测唯一约束冲突的另一个SO问题-Offtopic,但为什么需要显示错误?有些人确实有相同的名字和姓氏。@Daan这正是我所想的:)同意。最好使用其他更可能是唯一的标识符,例如学生ID,然后向表中的该列添加唯一约束。这只是我正在做的项目的一部分。其中一个要求是只允许学生使用唯一的名字和姓氏。使用一个存储过程,首先检查是否存在符合上述条件的用户,如果不存在,则添加记录并返回成功消息,否则返回choosingOfftopic的错误,但为什么需要显示错误?有些人确实有相同的名字和姓氏。@Daan这正是我所想的:)同意。最好使用其他更可能是唯一的标识符,例如学生ID,然后向表中的该列添加唯一约束。这只是我正在做的项目的一部分。其中一个要求是只允许学生使用唯一的名字和姓氏。使用一个存储过程,首先检查是否存在符合上述条件的用户,如果不存在,则添加记录并返回成功消息,否则返回您选择的错误