0

以下代码正在运行(它将数据发送到数据库)。但是我一打开页面就会得到“通知:未定义的索引”,它还在数据库中创建了一个空行(我的意思是,每个字段的 onde 空值)。如果我填写这些字段并提交它会起作用,但是它们会保存在数据库中。我想我需要一个代码来告诉“提交”不要将数据发送到空的数据库。那是什么代码?我不熟悉mysqli。

<?php
$con=mysqli_connect("localhost","root","","activitytest1");

if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$sql="INSERT INTO activitytest1 (type, description, author, outcome, pre, whileact, postact, path, books, grouping, time)
VALUES
('$_POST[type]','$_POST[description]','$_POST[author]','$_POST[outcome]','$_POST[pre]','$_POST[whileact]','$_POST[postact]','$_POST[path]','$_POST[books]','$_POST[grouping]','$_POST[time]')";

if (!mysqli_query($con,$sql))
  {
  die('Error: ' . mysqli_error($con));
  }
$result = mysqli_query($con,"SELECT * FROM activitytest1");

while($row = mysqli_fetch_array($result))
  {
  echo "<br/>

<table width='909' border='1' align='center' cellpadding='5' cellspacing='0'>
  <tr>
    <td width='125'>" . $row['type'] .  "</th>
    <td width='680'>" . $row['description'] .  "</th>
    <td width='120'>" . $row['author'] .  "</th>
  </tr></table> <br/>" . $row['pre'] .  "<br/>" . $row['whileact'] .  "<br/>" . $row['postact'] .  "<br/>" . $row['outcome'] .  "<br/>" . $row['path'] . "<br/>" . $row['books'] .  "<br/>" . $row['grouping'] .  "<br/>" . $row['time'] . "<hr size='1'/>";
  }

mysqli_close($con);
?>


<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test 1</title>
</head>
<body>

<br>
<table width="909" border="1" align="center" cellpadding="5" cellspacing="0">
  <tr>
    <th width="125" scope="col">Type</th>
    <th width="680" scope="col">Description</th>
    <th width="120" scope="col">Author</th>
  </tr></table>
  <br>
<form action="index.php" method="POST">

<table width="909" border="1" align="center" cellpadding="5" cellspacing="0">
     <td width="125"><label>

     </label>
       <select name="type" id="type" onChange="display(this,'Task','Semi-task','Practice','Exercise','Lead-in');">
         <option value="Unselected" selected="selected">Choose one:</option>
         <option value="Task">Task</option>
         <option value="Semi-task">Semi-task</option>
         <option value="Practice">Practice</option>
         <option value="Exercise">Exercise</option>
         <option value="Lead-in">Lead-in</option>
         <option value="Game">Game</option>
         <option value="Video">Video</option>
         <option value="Song">Song</option>
         <option value="Mimio">Mimio</option>
         <option value="Other">Other</option>
       </select></td>
    <td width="680"><div id="Semi-task" style="display: none;">
      Pre:<br>
    </div>
        <div id="Exercise"  style="display: none;">whileact:</div>
        <br>
        <div id="Practice" style="display: none;">
      Post:<br>
      <br>
       </div>
        <div id="Task"  style="display: none;"> Outcome: <br />
        <textarea name="description" cols="70" rows="2"></textarea>
            <br />
        </div>
        <div id="Lead-in" style="display: none;">
      Link/Path:<br>
      <br>
       </div></td>
    <td width="120"><input name="author" type="text" size="12" maxlength="25" /></td>
  </tr>
     <tr>
       <td colspan="3">      <textarea name="pre" id="Pre" cols="45" rows="5"></textarea>
                       <br /><textarea name="whileact" id="whileact" cols="45" rows="5"></textarea>
                       <br /><textarea name="postact" id="Post" cols="45" rows="5"></textarea>
                       <br /><textarea name="outcome" id="Outcome" cols="45" rows="5"></textarea>
                       <br /><input type="text" name="path" id="Path" />
                       <br /><input type="text" name="books" id="Books" />
                       <br /><input type="text" name="grouping" id="Grouping" />
                       <br /><input type="text" name="time" id="Time" />
                       </td>
     </tr>
    <tr>
       <td colspan="3"><input type="submit" name="submit" value="Comment" /></td>
     </tr>
</table>
</form>


</body>
</html>
4

2 回答 2

0

如果字段为空,您可以添加 javascript 代码来停止表单提交,但这并不能阻止有人绕过这些检查并仍然向您的脚本发送错误数据。此外,如果他们没有运行 javascript,则不会进行检查。

在这两种情况下,您都需要更改 PHP 代码,以便仅在数据被验证为 null 并且所有 SQL 注入攻击都得到保护后才将数据存储到数据库中。

基本上只有在您检查所有字段都有输入并确保所有输入在插入数据库之前都通过 htmlentities() 之后才执行 SQL 插入。

如果输入中有错误,我还将使用默认的原始值重新加载表单,并显示一条很好的消息,说明在接受表单之前需要完成哪些字段。

于 2013-09-01T23:24:32.507 回答
0

每次页面加载时,您的 PHP 代码都会运行。第一次加载时,没有$_POST设置任何变量;所以你看到了未定义的索引错误,它在数据库中添加了一个空白行。

您需要检查您的 PHP 以查看页面是否已提交 - 您只需将 PHP 代码包装在 if 语句中

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

您还可以对要插入的每个值使用相同的函数,以便在插入数据库之前验证数据:

 if (! isset($_POST['type'])) {
      $errorMessage = "Please a Type";
 } elseif (! isset($_POST['description'])) {
      ......

您可能还想查看绑定这些变量并使用准备好的语句;否则,您的代码将面临 SQL 注入漏洞。您已经在使用mysqli_,所以不妨利用它,让它帮助您编写更安全的代码。

于 2013-09-01T23:25:55.160 回答