多个字段,大量记录的插入操作技巧(PHP)

在使用php+mysql开发的时候,插入/删除数据是免不了的,我想大家早已习惯了诸如bbs发表,留言簿的一条,一条的数据输入的模式.

但是在很多工程里,逐条输入数据是不被允许的.

比如,输入学生的考试成绩,逐条输入需要点击"提交"40多次,这很大程度消磨了班主任的耐心和时间,如何"一口气"输入完一个班级的数据,是校园管理系统的一个要点(当然,其他场合也经常有这种要求)

下面的文章仅仅是我的工作经验,供学习PHP的同道们参考.(高手大概会一笑了之吧)

主要思路有二:1.动态生成表单和域的属性

2.用变量表示变量

首先看看数据结构:

create table score

(

score_id int unsigned primary key auto_increment,

s_no int unsigned not null,

grade tinyint not null,

class tinyint not null,

class2 tinyint ,

subject char(6) not null,

score tinyint default '0'

)type=MYISAM;

create table students

(

imitate int unsigned primary key,

s_no int unsigned ,

s_name char(10) not null,

......

)type=MYISAM;

其中s_no是学号,是整个程序的关键.由于这个学校语数外是分8个等级班的,所以,成绩表中多一个class2字段.

目的是在一个表单中输入全班40多人的"分类班,成绩"数据,一次性提交.

由于输入牵涉多个字段,而且需要插入的记录不止一条,给编程提高了难度.这里牵涉了2个字段,但是我们举一反三后可以解决任何多个字段的问题.(当然,表单是需要动态生成的.)

废话不多说了,看看源代码吧:

(因为这个站点没有把html标签给过滤掉,请大家把下面代码copy到dreamweaver的代码视图里再看.)

<html>

<?

//连接数据库

include("const.php");

include("link.php");

//如果没有表单提交,执行下面操作

if(!empty($HTTP_POST_VARS)) {

//获得POST变量

$grade = $_POST["grade"];

$tclass = $_POST["tclass"];

//由于学号最后两位不会超过60,我们一个一个接收

for($i = 1;$i < 60;$i++) {

//第一条记录的分类班和成绩的"变量名"(注意还不是数值)

$fenlei = "a".$i;

$score = "b".$i;

//因为学号可能有间隔,先判断值是否存在

if(!empty($_POST["$fenlei"]) && !empty($_POST["$score"]))

{

//如果register_globals = on,则下面直接使用$$fenlei和$$score.

//我们假设register_globals = on,如果你的设置不是,那么请再定义两个变量接收它们的值.

//重新生成完整的学号.

$s_no = $grade*10000+$class*100+$i;

//生成query语句,用到了"变量的变量".当然,如果register_globals = off,则又有不同.

$query = "insert into score (s_no,grade,class,class2,score) values ('$s_no','$grade','$tclass','".$$fenlei."','".$$score."')";

//显示,看看语句是否正确.

echo $query."<br>";

//执行语句,我没有写出来.

}

}

}

?>

<head>

<title>TEST</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body>

<form action="test.php" method="post" name="form1"

target="_self">

<table width="400" border="0" cellpadding="0"

cellspacing="0">

<tr>

<td height="20" colspan="3">年级(入学年):

<input name="grade" type="text" id="grade"

size="10" maxlength="2">

班级:

<input name="tclass" type="text" id="tclass"

size="10" maxlength="2"></td>

</tr>

<tr>

<td width="200" height="20">学号</td>

<td width="100">分类班</td>

<td width="100">成绩</td>

</tr>

<?

//取得学生的学号.应该在此前获得班级和年级,并写进where子句的,但我们只是做个试验,就省略了.

$query = "select s_no from students where ......";

$re = mysql_query($query,$lnk);

while($form = mysql_fetch_object($re))

{

//获得学号的最后两位.

$student_no = $form->s_no % 100;

?>

<tr>

<td height="20">

<?=$form->s_no;?>

</td>

<!-

动态生成text域的name属性,注意!不要写id属性,以免重复!

->

<td><input name="a<?=$student_no;?>" type="text"

size="10" maxlength="10"></td>

<td><input name="b<?=$student_no;?>" type="text"

size="10" maxlength="10"></td>

</tr>

<?

}

?>

<tr>

<td height="20" colspan="3"><div align="center">

<input type="submit" name="Submit" value="Submit">

</div></td>

</tr>

</table>

</form>

</body>

</html>

结果如下,共有这么些SQL语句被执行:

insert into score (s_no,grade,class,class2,score) values ('990001','99','6','a','90')

insert into score (s_no,grade,class,class2,score) values ('990002','99','6','a','86')

insert into score (s_no,grade,class,class2,score) values ('990003','99','6','a','84')

insert into score (s_no,grade,class,class2,score) values ('990005','99','6','b','75')

insert into score (s_no,grade,class,class2,score) values ('990006','99','6','b','80')

insert into score (s_no,grade,class,class2,score) values ('990007','99','6','b','79')

一个班级需要40多次循环,mysql_query()函数执行40余次,在网络环境较好的情况下,耗时1秒左右(mysql就是快)当然,可以生成一条超长的SQL语句,执行一次query.至于哪个效率更高,大家自己试试看吧.

这个方法的优点就是可以不必一次次点击"递交",不足之处在于,一次必须把数据全部输入!(有点矛盾?)是的!如果再次使用这个功能,而又输入重复的数据会怎样?解决办法是有的,就是每次循环时执行query前,判断该记录是否存在.这似乎又得执行一条额外的query.就是说,要确保数据正确,而一个班有n个人的话,总共需要N*2次query.

还有一个办法是在生成表单的时候加以限制,这样可以分散系统负荷,明显要好过前一个方案.

不知道还有没有更好的办法使效率和稳定兼得,靠大家指教了.

时间: 2024-10-15 17:06:31

多个字段,大量记录的插入操作技巧(PHP)的相关文章

在网页中插入记录到sql中,在抛出异常后,如何继续执行其它记录的插入操作?

问题描述 由于表中设置了主键,因此在插入数据的时候,如果有主键重复的记录,会抛出异常,然后就终止所有的插入操作.插入多条记录,其中有一些是主键重复的,有一些是不重复的,我想实现的是插入与主键不重复的记录,而现在的情况是一旦有与主键重复的记录就跳出循环不再插入后续的记录了.我采用的插入方式是:循环逐条插入记录.请问有没有解决的方法? 解决方案 解决方案二:...解决方案三://替換成你的循環for(inti=0;i<10;i++){try{//插入的語句}catch(Exception){//記錄

mysql插入操作-MySQL主键字段自增长的插入

问题描述 MySQL主键字段自增长的插入 在插入记录时,主键的自增长序号不连续是什么原因?有人说是什么事物回滚? 解决方案 数据回滚式插入失败,造成该立键已用,相应跳过了. 解决方案二: 是不是有出现插入失败等 这样就会导致对应主键值不连续 解决方案三: 事务回滚就是你给对方打钱,你的钱数已经被扣了,但这时ATM突然坏了,对方没有收到钱,你的钱肯定不能飞了吧,它就只好回到打钱之前的状态.你描述的问题有可能是回滚引起的,建议再查查.

关于有默认值的字段在用EF做插入操作时的思考

原文:关于有默认值的字段在用EF做插入操作时的思考 今天在用EF做插入操作的时候发现数据库中一个datetime类型的字段(CreateDate)的值居然全部为null.于是赶紧看表结构发现CreateDate字段居然是允许为空的. 虽然为空,但是设置了默认值getdate(),按说不应该为null的.于是开始测试. 字段允许Null值的情况 Users表结构如下: 假如一个字段有了默认值,并且又允许为Null,在做插入操作时会发生什么? 如上图中的表结构,CreateDate是允许为null的

MySql insert插入操作的3个小技巧分享_Mysql

1.插入的数据来源自其他表 表A有id, cola 字段 表B有id, cola, colb...等字段,其中id都为主键,cola为相同名字的列 现想将表B中colb>1000的记录都插入表A中,SQL语句可以这样写: 复制代码 代码如下: insert into A(id,cola) select id,cola from B where colb>1000  2.插入时排除(忽略)重复记录 现表A中有一部分记录了,再做如1中的插入操作可能遇到重复的key导致操作失败 复制代码 代码如下:

基于Metronic的Bootstrap开发框架经验总结(17)-- 使用 summernote插件实现HTML文档的编辑和图片插入操作

在很多场合,我们需要在线编辑HTML内容,然后在页面上或者其他终端上(如小程序.APP应用等)显示,编辑HTML内容的插件有很多,本篇介绍基于Bootstrap的 summernote插件实现HTML文档的编辑和图片插入操作,这个控件的使用非常方便,并且用户群也很大. Summernote 是一个简单灵活,所见即所得(WYSIWYG)的编辑器,Summernote是一个轻量级.灵活基于Bootstrap和jQuery的HTML文本编辑器,拥有强大的API配置功能,多国语言支持支持Bootstra

ORACLE空间管理实验(六)块管理之ASSM下插入操作

高水位的影响及大并发插入的性能问题 一.数据块的插入时寻找可用块的规则总结: 高水位与低高水位:低高水位与高水位之间存在的数据块的状态可能是未格式化或格式的.低高水位以下的是格式化了的,可以被使用. 1.首先,插入一条数据,只会使用高水位以下的数据块. 高水点的位置:L1块所包含数据块的边界,要么是区的边界 2.第一次插入一行数据,格式化块数? 并没有一个一定的数值,从DUMP L1块中看,有格式化5个,32个64个等. 3.插入一行数据,如何通过L3-->L2-->L1--数据块,这个过程来

asp。net formview如何取消插入操作

问题描述 asp.net formview如何取消插入操作 formview再插入时,插入了一条重复得记录,如何再点击插入之后,取消该插入操作 解决方案 e.Cancel = true;就行了 解决方案二: e.Cancel = true;就行了

我第一次提交数据,就会提示用户资料已经存在,而且记录还插入数据库了,不知道是哪里出错了?

问题描述 我第一次提交数据,就会提示用户资料已经存在,而且记录还插入数据库了如果我不使用回车提交表单的功能,Name.Attributes.Add....这行代码,就一切正常请大家帮忙看一下吧,都不知道是哪里的问题了C#Code:protectedvoidPage_Load(objectsender,EventArgse){if(!Page.IsPostBack){Name.Attributes.Add("onkeydown","if(event.keyCode==13){d

请问,为什么使用OleDbCommand.ExecuteNonQuery()插入一条记录,插入成功后,返回值还是为0?

问题描述 privatestaticvoidPrepareCommand(OleDbCommandcmd,CommandTypecmdType,stringcmdText,OleDbParameter[]cmdParms){cmd.CommandType=cmdType;cmd.CommandText=cmdText;if(cmdParms!=null)foreach(OleDbParameterparmincmdParms)cmd.Parameters.Add(parm);}publicsta