【问题标题】:PHP not Reading <select> name for MySQL UpdatePHP 未读取 MySQL 更新的 <select> 名称
【发布时间】:2017-01-03 05:06:18
【问题描述】:

我正在开发一个梦幻足球数据库只是为了好玩,我在 PHP 页面上取得了一些进展,但在从我的 html 数据中获取数据以供我的 php 更新脚本 (update.php )

这是我的表单代码:

  $servername = "localhost";
  $username = "root";
  $password = "nottelling";
  $dbname = "Football";

  // Create connection

  $conn = new mysqli($servername, $username, $password, $dbname);

  // Check connection

  if ($conn->connect_error){
    die("Connection failed: " . $conn->connect_error);
  } 

  $sqlqb = "SELECT Name_Team_Position FROM Football.2016_Players_QB;";
  $resultqb = $conn->query($sqlqb);
  echo " <form method=\"post\" action=\"update.php\"> <br> Enter Passcode:";
  echo " <input name = \"Passcode\" type = \"text\"> </input> <br><br> ";
  echo " Pick your QB: <select name='QB'> </option> "; // list box select command
  foreach ($conn->query($sqlqb) as $row){         
    // Array or records stored in $row
    echo " <option value=$row[id]>$row[Name_Team_Position]</option> "; 
    /* Option values are added by looping through the array */ 
  }  
  echo " </select> ";// Closing of list box
  echo " <br><br> <input type=\"submit\" value=\"Submit\"> </input> ";
  echo " </form> ";
  $conn->close();
 ?>

这里是 update.php

  $servername = "localhost";
  $username = "root";
  $password = "nottelling";
  $dbname = "Football";

  // Create connection

  $conn = new mysqli($servername, $username, $password, $dbname);

  // Check connection

  if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
  } 

  $value1 = $_POST['Passcode'];
  $value2 = $_POST['QB'];

  $sql = "UPDATE Football.PlayerTeams SET QB = '$value2' WHERE Password = '$value1';";

   if ($conn->query($sql) === TRUE) {
     echo "New record created successfully";
   } else {
     echo "Error: " . $sql . "<br>" . $conn->error;
   }

  $conn->close();

?>

我的问题尽可能简明扼要:

此脚本肯定正确连接到数据库并成功执行更新查询。问题是 $value1 没有从 html 表单接收任何值。如果我将字符串“test”插入到与密码对应的行中,然后我使用此代码生成的表单,它会成功运行,但是当我检查数据库“test”时消失了,而只是空白 - “”。有人可以帮我弄清楚我在尝试将下拉值添加到我的操作脚本时做错了什么吗?

【问题讨论】:

  • 您的代码有缺陷,$row[id] 不存在,因为 PHP 中的 id 被读取为常量而不是字符串 'id'。这是一些非常基本的 PHP 就在这里。如果您启用错误报告,您会发现这一点。你没有。在开发时启用它,它是... 简单。其次,也许您应该阅读mysql_connect(并记下巨大的红色块),因为显然,您并不关心 mysql 注入,那么您为什么要使用mysqli
  • @Xorifelse 恭喜,你已经成功地口头攻击了一个不太懂 PHP 的人!
  • 我没有学,因为我的老师对我很好,您应该根据给定的信息和enable error reporting first采取行动,将警告一一消除,将您的代码更新为prevent mysql injections。之后,检查var_dump($_POST) 是否包含正确的值。
  • 其次,您可能想要创建一个名为db.php 的文件并将this 代码粘贴到其中。现在,对于您的update.phpindex.php,您只需执行include 'db.php'$conn = getdbconn(); 即可在您需要更改服务器设置时节省大量时间。
  • @Xorifelse 您似乎错过了这里没有错误的事实。只是不正​​确的值名称。

标签: php html mysql


【解决方案1】:

这是错误的:

echo " Pick your QB: <select name='QB'> </option> ";

&lt;/option&gt; 放置错误

替换:echo " Pick your QB: &lt;select name='QB'&gt;";

替换:echo " &lt;br&gt;&lt;br&gt; &lt;input type=\"submit\" value=\"Submit\"&gt;";

$row['id'] 是您在 POST 中成为 QB 的值。

echo " <option value='TheValueYouNeededHere'>Display Name</option> "; 

对于 POST 使用 filter_input — 按名称获取特定的外部变量并可选择过滤它:

filter_input(INPUT_POST, QB, filter);

您在此处找到的过滤器:http://php.net/manual/de/filter.filters.php

从用户那里复制:

$sql = "UPDATE Football.PlayerTeams SET QB = '".$value2."' WHERE Password = '".$value1."'";

为了眼睛更漂亮,千万不要用“.$Value”。在php中没有我的意思,当我错的时候纠正我

安全性:

您的 MySQL 查询可以轻松注入。你的密码是可见的。 它提供了多种选择来避免这种情况。

MySQL 注入: 您可以替换一些字符。 (字符是单个字符) 您可以用其他角色替换的最危险的东西。过滤器输入有很好的过滤器,比如 htmlspecialchars。我想如果你搜索得少,你会发现很多东西:)

密码: 首先制作&lt;input type='password'&gt;。 然后散列您的密码或选择 MD5 或其他东西使其“不可读”。您可以在 MySQL 上设置它。使用 PHP 构建“安全”值。 MD5 不是最佳选择。它只是在开始时很容易实现。

希望这会有所帮助:)

【讨论】:

  • $row[id]...你不是说$row['id']??
  • 我似乎在其他答案中复制粘贴自己,您建议使用 mysql 注入...mysqli 完全可以防止这种情况发生。
  • 它提供了很多防止mysql注入的方法;)
  • @ivorysmoker 你最接近 - 我现在已经在你的帮助下解决了这个问题。首先,您注意到错误的 是可靠的,但您也注意到 value='$row[id]',它应该只是“$row[Name_Team_Position]”,一旦我纠正它,我就成功了将提交的字符串输入数据库。也感谢您对 SQL 注入攻击的正确附加建议。该数据库不包含任何类型的 PI 信息,上面列出的连接详细信息不是我实际使用的。这个问题是在“沙盒”、非互联网环境中提出的。
【解决方案2】:

因为您在选项的 value 属性中没有任何内容。尝试检查选项标签,你会看到你的 value =$row[id] 这是毫无意义的尝试使用这个

echo " <option value='".$row['id']."'>$row['Name_Team_Position']</option> ";

foreach ($conn->query($sqlqb) as $row)

  { ?>

 <option value=<?php echo $row[id];?>><?php echo $row['Name_Team_Position'];?></option>


 <?php } ?> 

【讨论】:

  • 这也适合你,'id' 将被视为常量而不是数组索引。
【解决方案3】:

请尝试以下方法并告诉我。

echo " Pick your QB: <select name='QB'> </option> "; // list box select command
foreach ($conn->query($sqlqb) as $row){
echo " <option value=$row[id]>$row[Name_Team_Position]</option> "; 

进入 echo "选择你的 QB:"; // 列表框选择命令 而($row = $resultqb->fetch_assoc()){ echo " ".$row['Name_Team_Position']." ";

$sql = "UPDATE Football.PlayerTeams SET QB = '$value2' WHERE Password = '$value1';";

进入

$sql = "UPDATE Football.PlayerTeams SET QB = '".$value2."' WHERE Password = '".$value1."'";

【讨论】:

  • 这不起作用,id 将被视为常量而不是数组索引。其次,内联数组应该使用{}
  • 现在你建议使用 mysql 注入...mysqli 完全可以防止这种情况发生。
【解决方案4】:

尝试替换

foreach ($conn->query($sqlqb) as $row)

{  // Array or records stored in $row

echo " <option value=$row[id]>$row[Name_Team_Position]</option> "; 

/* Option values are added by looping through the array */ 

while($row = $resultqb->fetch_assoc()) 

{  // Array or records stored in $row

echo " <option value=$row['id']>$row['Name_Team_Position']</option> "; 

/* Option values are added by looping through the array */ 

编辑 数组索引应该是字符串。

【讨论】:

  • 这不起作用,'id' 和 'Name_Team_Position' 将被视为常量而不是数组索引。其次,内联数组应该使用{}
  • 只是部分代码被替换,是的,每个索引都应该是字符串,我的错。谢谢
猜你喜欢
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2012-05-10
相关资源
最近更新 更多