我的编码错误,但不知道如何纠正它,想知道是否有人可以伸出援助之手?

Hub*_*ert 1 php database arrays foreach

嗨我在php中遇到foreach函数的问题...我使用该函数将数组的结果输入到数据库中.例如,如果是Array(3,5,7),系统应该在数据库中输入3个不同的条目.但是,在我的情况下,它只创建了一个条目而完全忽略了另一个2.我知道是否有人能发现我的错误?

我创建了一个带有复选框的表单,并尝试检索值并为每个值赋予一个单独的数组,例如:

<form name="appoptions" id="applicationoptions" method="post" action="s_apply_now.php">
<table width="100%" class="apptable" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td><input type="checkbox" name="cat[]" value="1" /> CAT 2PG</td>
    <td><input type="checkbox" name="cat[]" value="2" /> CAT 1OR</td>
    <td><input type="checkbox" name="cat[]" value="3" /> CAT 2TT</td>
  </tr>
  <tr>
    <td><input type="checkbox" name="cat[]" value="4" /> CAT 3PG </td>
    <td><input type="checkbox" name="cat[]" value="5" /> CAT 2OR</td>
    <td><input type="checkbox" name="cat[]" value="6" /> CAT 3TT</td>
  </tr>
  <tr>
    <td><input type="checkbox" name="cat[]" value="7" /> CAT 4PG</td>
    <td><input type="checkbox" name="cat[]" value="8" /> CAT 3OR</td>
    <td>&nbsp;</td>
  </tr>
</table>
</form>
Run Code Online (Sandbox Code Playgroud)

点击确认后,它将进入处理器页面.在我的处理器页面中,我试图提取值但我意识到它在一个数组中:

<?php
session_start();
include'Connections/database.php';
$conn = dbConnect ();
    if (! $conn)
    die("Couldn't connect to MySQL");
    $user = $_SESSION['eid'];
    $query = "select MED  from emp where EID = '$user'";
    $result = mysql_query($query, $conn);
    $row = mysql_fetch_assoc($result);

$med = $row['MED']; 
$user =$_SESSION['eid'];
$class=$_POST['class'];
$cat_arr=$_POST['cat'];


$i = 0; /* for illustrative purposes only */

foreach ($cat_arr as $cat) 
{
    if ($med=='no')
    {

        if (! $conn)
        die("Couldn't connect to My SQL");

        $query = "insert into permit (EID, PTYPE, STATUS) values ('$user,$cat, 'medical')";
        $result = mysql_query($query,$conn);
        header ('Location:medical_question.php');
        $i++;
    }
    else
    {

        if (! $conn)
        die("Couldn't connect to My SQL");
        $query = "insert into permit (EID, PTYPE) values ('$user,$cat)";
        $result = mysql_query($query,$conn);
        $i++;
    }
 }
dbDisconnect($conn);
 ?>
Run Code Online (Sandbox Code Playgroud)

如果每个人都是错误的话我不是偶然的,但我认为它在那里......

提前致谢.

Tra*_*ty3 5

我看到你的PHP代码有一些不同的错误:

  1. 您不应该在循环中连接/断开MySQL.这是不必要的开销.相反,在循环之前连接并在之后断开连接.
  2. 在查询中使用之前,您需要清理任何用户输入.您的代码容易受到SQL注入攻击.
  3. 您还应该将您的header('Location:medical_question.php');行移到循环之外,并且应该将其更改为die(header('Location:medical_question.php'));以便停止执行其余的脚本(假设您想要发生这种情况).
  4. 您需要修复查询中的单引号:

    insert into permit (EID, PTYPE, STATUS) values ('$user,$cat, 'medical')

    应该:

    insert into permit (EID, PTYPE, STATUS) values ('$user', '$cat', 'medical')

    对于您的其他查询也是如此.

最后,您的脚本看起来会更像这样:

$conn = dbConnect();
if (!$conn)
    die("Couldn't connect to MySQL");

$user = mysql_real_escape_string($_SESSION['eid']);
$class = $_POST['class'];
$cat_arr = $_POST['cat'];

foreach ($cat_arr as $cat) 
{
    $cat = mysql_real_escape_string($cat);

    if ($med == 'no')
        $query = "INSERT INTO permit (EID, PTYPE, STATUS) VALUES ('{$user}', '{$cat}', 'medical')";
    else
        $query = "INSERT INTO permit (EID, PTYPE) VALUES ('{$user}', '{$cat}')";

    mysql_query($query);
}

dbDisconnect($conn);

if ($med == 'no')
    $nextPage = "medical_question.php";
else
    $nextPage = "next_page.php";

die(header("Location:{$nextPage}"));
Run Code Online (Sandbox Code Playgroud)

SQL注入示例:

假设您的查询如下所示:

$user = $_GET["user"];
$cat = $_GET["cat"];
$query = "insert into permit (EID, PTYPE, STATUS) values ('$user', '$cat', 'medical')";
Run Code Online (Sandbox Code Playgroud)

如果我传入这样的值,你的查询会是什么样子user:

`'); DROP TABLE permit; /*`
Run Code Online (Sandbox Code Playgroud)

那会把你的查询变成这样:

insert into permit (EID, PTYPE, STATUS) values (''); DROP TABLE permit; /*', 'cat', 'medical')
Run Code Online (Sandbox Code Playgroud)

绝对不是你想要发生的事情.使用时清理输入时mysql_real_escape_string,它将转义单引号字符,查询将失败或整个字符串将被插入而不是被执行.


更新:

header如果您确切知道函数的作用,那么您想要移动循环外部的原因将更容易理解:

当您调用PHP header函数时,您告诉PHP(在服务器端)将HTTP标头发送到浏览器(在客户端).在这种情况下header('Location:...'),您发送的HTTP标头会导致浏览器重定向到其他页面并断开与当前PHP脚本的连接.

所以这是发生的事件过程:

  1. PHP脚本发送HTTP标头,并且根据延迟,浏览器可能需要一些时间才能接收它.
  2. 浏览器会解释标头并重定向到您指定的位置,该位置还会向当前正在执行的PHP脚本发送断开连接消息.
  3. 同样,根据延迟,服务器可能需要一些时间才能从浏览器接收断开连接消息.

在PHP脚本发送标头然后接收断开连接消息的时间之间,脚本仍在执行.在收到断开连接消息之前,无法确定脚本将执行多少代码,因此您根本无法依赖此代码.这就是您die在发送标题时应该这样做的原因.

知道这就是PHP header函数的工作原理,你可能想把它放在循环中的唯一原因就是你希望当前脚本在循环中间停止执行,具体取决于某些条件.像这样:

foreach ($vars as $var)
{
    if ($var == "stop")
        die(header("Location:anotherPage.php"));

    // do something as long as $var != "stop"
}
Run Code Online (Sandbox Code Playgroud)

这将循环遍历$var数组,直到达到该值"stop",此时它将向客户端发送重定向标头并停止执行.

与您的示例的不同之处在于(在您编辑它之前)您的循环包含一个if-else语句,并且在if 之中else,您都有标题重定向调用.所以无论如何,它都会在循环的第一次迭代中发送,这没有意义.如果这真的是你想要的,你将不会使用循环.它只会执行一次,这会破坏循环的目的.

对于冗长的响应感到抱歉,但希望您现在能够更好地了解代码中的实际情况.