在数据库上插入记录时未定义的索引

Posted

技术标签:

【中文标题】在数据库上插入记录时未定义的索引【英文标题】:Undefined index in inserting records on DB 【发布时间】:2012-02-18 14:45:01 【问题描述】:

我正在开发一个系统,我想检查是否存在记录。如果存在记录,则它不会记录数据,而是返回到表单。如果数据不存在,则继续将数据记录到数据库中。

html 表单:

 <form name="studentform" onSubmit="return validate_form ( );" action="queries/insert.php" method="post">

Student Number: <input type="text" name="studentnumber"/>
    College:
 <select name="college" id=a></select>

&nbsp;&nbsp;Course:
<select name="course" id=b></select>

 <input type="radio" name="status" value="regular" />Regular&nbsp;&nbsp;
<input type="radio" name="status" value="irregular" />Irregular 
    <br><br>
    <hr>
    <br>
   Name:
    <input type="text" name="lname"> &nbsp;
    <input type="text" name="fname"> &nbsp;
    <input type="text" name="mname">   


Address: 
<input type="text" name="address" />

<br><br>

 Gender: 
 <select name="gender">
<option value="">---</option>  
<option value="Male">Male</option>
<option value="Female">Female</option>
</select>



<input type="submit" value="Submit">
</form>

PHP 形式:

 $query = ("SELECT studentnumber FROM students where studentnumber = '$_POST[studentnumber]'");
 $result=mysql_query($query);

 if($result)
    
      if(mysql_num_rows($result) >= 1)
       
      echo "<script type='text/javascript'>alert('User already exist'); location.href = '../admin_home.php';</script>";
      
      
   else

$sql="INSERT INTO students (studentnumber, college, course, status, lname, fname, mname, address, gender)
VALUES
('$_POST[studentnumber]','$_POST[college]','$_POST[course]','$_POST[status]','$_POST[lname]','$_POST[fname]','$_POST[mname]','$_POST[address]','$_POST[gender]')";

if (!mysql_query($sql,$con))
  
  die('Error: ' . mysql_error());
  

  echo "<script type='text/javascript'>alert('Record Successfully Added'); location.href = '../admin_home.php';</script>";

我不知道为什么,但我总是得到未定义的索引错误。也许我在某个地方做错了什么。谢谢!!

【问题讨论】:

首先 - 阅读“SQL 注入” - 你的代码不安全。 错误的行号会有所帮助 写入完整错误 注意:未定义索引:第 11 行 C:\xampp\htdocs\SIS\WEW\queries\insert.php 中的学生编号这是错误,第 11 行将是“$query = (” SELECT studentnumber FROM students where studentnumber = '$_POST[studentnumber]'");" PHP: "Notice: Undefined variable" and "Notice: Undefined index"的可能重复 【参考方案1】:

“未定义索引”指的是您的数组(可能是 $_POST),它应该是一个通知,而不是一个错误。你能发布确切的消息吗?

同时,将第一行换成

$query = "SELECT studentnumber FROM students where studentnumber = '".mysql_real_escape_string($_POST['studentnumber'])."'";

此外,打印出查询以确保它看起来像您期望的那样有助于调试:

print $query."<br />";  // obviously

[edit]当您现在发布错误消息时,它变得更加简单 - $_POST['studentnumber'] 不存在。检查您的表格。

调试发布结果的一个好方法是使用代码

print '<pre>';
print_r($_POST);
print '</pre>';

【讨论】:

我建议使用准备好的语句。 同意。我想我只是把它放在这里作为对其他人的提醒。【参考方案2】:

试试这个:

if( isset($_POST['submit']) )

  $student_num = mysql_real_escape_string( $_POST['studentnumber'] );
  // Set all the require form fields here with mysql_real_escape_string() fun

  if( !empty($student_num) )
    // Your Query Here
  
  else
   echo 'Value not Set in Student Number Field!';
  

编辑:首先检查isset($_POST['submit'])之后的所有字段,以便确认所有值是否正确获取

获取所有必需的值后开始查询

【讨论】:

【参考方案3】:

问题出在您的查询中:

 $query = ("SELECT studentnumber FROM students where studentnumber = '$_POST[studentnumber]'");

$_POST[studentnumber] 不正确。它必须是$_POST['studentnumber']。注意键周围的引号。

我建议这样做:

$query = sprintf("SELECT studentnumber FROM students where studentnumber = '%s'"
                  , mysql_real_escape_string($_POST['studentnumber']));

相应地更改所有查询。

【讨论】:

我认为这不会影响查询中的$_POST[studentnumber] 会的,因为$_POST 将键作为字符串。就她而言,她将键称为常量 但是没有像$_POST[studentnumber]这样的''单引号的键也可以工作 没错,它会起作用的。但这只是因为 PHP 无法识别常量 studentnumber,因此假定它是 'studentnumber'。但它会抛出一个通知——其目的是通知程序员他犯的错误,以便他可以纠正它。除非是错误,否则不应使用。 嗯,现在明白了,但在 php 4.4.9 中它没有提供通知,因为我在 php 4.4.9 和 php 5.3 中运行相同,并在 php 5.3 中得到了通知,谢谢

以上是关于在数据库上插入记录时未定义的索引的主要内容,如果未能解决你的问题,请参考以下文章

innodb的索引数据结构定义在哪些文件中的

数组中存在键时未定义的索引错误

声明变量时未定义的索引

为啥在尝试读取记录集字段时未定义访问 vba 抛出子或函数?

mysql插入记录时违反唯一索引的处理

mysql插入记录时违反唯一索引的处理