Php 我的编码有错误,但不知道如何更正,不知是否有人能帮忙?

Php 我的编码有错误,但不知道如何更正,不知是否有人能帮忙?,php,database,arrays,foreach,Php,Database,Arrays,Foreach,您好,我在php中遇到了foreach函数的问题。。。我使用该函数将数组的结果输入数据库。例如,如果数组是3,5,7,系统应该向数据库中输入3个不同的条目。然而,在我的例子中,它只创建了一个条目,而完全忽略了另外两个条目。我能知道是否有人能发现我的错误吗 我创建了一个带有复选框的表单,并尝试检索该值,并为每个值指定一个单独的数组,例如: <form name="appoptions" id="applicationoptions" method="post" action="s_apply

您好,我在php中遇到了foreach函数的问题。。。我使用该函数将数组的结果输入数据库。例如,如果数组是3,5,7,系统应该向数据库中输入3个不同的条目。然而,在我的例子中,它只创建了一个条目,而完全忽略了另外两个条目。我能知道是否有人能发现我的错误吗

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

<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>
单击确认后,它将进入处理器页面。在我的处理器页面中,我试图提取值,但我意识到它存在于数组中:

<?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);
 ?>
我不是每一个人都是错的,但我认为它就在那里


提前感谢。

它只插入一次,因为在第一次插入后,您将重定向到medical_question.php

将此重定向移动到foreach外部:

header ('Location:medical_question.php');

此外,您还可以将db connect移动到foreach之前。

它只插入一次,因为在执行第一次插入后,您将重定向到medical_question.php

将此重定向移动到foreach外部:

header ('Location:medical_question.php');

此外,您还可以将db connect移动到foreach之前。

我发现您的PHP代码存在一些不同的错误:

您不应该在循环中连接/断开MySQL。这是不必要的开销。相反,在循环之前连接,然后断开连接。 在查询中使用任何用户输入之前,需要对其进行清理。您的代码易受攻击。 您还应该移动标题“Location:medical_question.php”;行,您应该将其更改为dieheader'Location:medical_question.php';为了阻止脚本的其余部分执行,假设这是您想要的。 您需要修复查询中的单引号:

在许可证EID、PTYPE、状态值“$user、$cat、‘medical’中插入

应该是:

在许可证EID、PTYPE、状态值“$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}"));
SQL注入示例:

假设您的查询如下所示:

$user = $_GET["user"];
$cat = $_GET["cat"];
$query = "insert into permit (EID, PTYPE, STATUS) values ('$user', '$cat', 'medical')";
如果我为用户传入这样的值,您的查询会是什么样子:

这将使您的查询变成:

insert into permit (EID, PTYPE, STATUS) values (''); DROP TABLE permit; /*', 'cat', 'medical')
这绝对不是你想要的。当您使用mysql\u real\u escape\u字符串清理输入时,它将转义单引号字符,查询将失败,或者插入整个字符串而不是执行

更新:

如果您确切地知道函数的作用,那么您希望将标头移出循环的原因将更容易理解:

调用PHP header函数时,您告诉服务器端的PHP向客户端的浏览器发送一个HTTP头。在标题“Location:…”的情况下,您正在发送一个HTTP标题,该标题会导致浏览器重定向到另一个页面并断开与当前PHP脚本的连接

这就是事件发生的过程:

PHP脚本发送HTTP头,根据延迟,浏览器可能需要一些时间来接收它。 浏览器将解释标头并重定向到您指定的位置,这还会向当前执行的PHP脚本发送一条断开连接消息。 同样,根据延迟,服务器从浏览器接收断开连接消息可能需要一些时间。 在PHP脚本发送头和接收断开连接消息之间,脚本仍在执行。在收到断开连接消息之前,无法判断脚本将执行多少代码,因此您根本无法依赖于此。这就是为什么你应该在发送标题时死亡

知道PHP头函数是如何工作的,你想把这个放进循环中的唯一原因是,如果你希望当前脚本在某个循环中停止执行,这取决于某个特定的条件。像这样:

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

    // do something as long as $var != "stop"
}
这将在$var数组中循环,直到到达值stop,此时它将向客户端发送重定向头并停止执行

与您的示例不同的是,在编辑它之前,您的循环包含单个if-else语句,并且在if和else中,您都有头重定向调用。所以不管怎样,它都会在循环的第一次迭代中发送,这是没有意义的。如果这是您真正想要的,那么就不会使用循环。它只执行一次,这违背了循环的目的


对于冗长的回答,我深表歉意,但希望您现在能够更好地理解代码中真正发生的事情。

我发现您的PHP代码存在一些不同的错误:

您不应该在循环中连接/断开MySQL。 这是不必要的开销。相反,在循环之前连接,然后断开连接。 在查询中使用任何用户输入之前,需要对其进行清理。您的代码易受攻击。 您还应该移动标题“Location:medical_question.php”;行,您应该将其更改为dieheader'Location:medical_question.php';为了阻止脚本的其余部分执行,假设这是您想要的。 您需要修复查询中的单引号:

在许可证EID、PTYPE、状态值“$user、$cat、‘medical’中插入

应该是:

在许可证EID、PTYPE、状态值“$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}"));
SQL注入示例:

假设您的查询如下所示:

$user = $_GET["user"];
$cat = $_GET["cat"];
$query = "insert into permit (EID, PTYPE, STATUS) values ('$user', '$cat', 'medical')";
如果我为用户传入这样的值,您的查询会是什么样子:

这将使您的查询变成:

insert into permit (EID, PTYPE, STATUS) values (''); DROP TABLE permit; /*', 'cat', 'medical')
这绝对不是你想要的。当您使用mysql\u real\u escape\u字符串清理输入时,它将转义单引号字符,查询将失败,或者插入整个字符串而不是执行

更新:

如果您确切地知道函数的作用,那么您希望将标头移出循环的原因将更容易理解:

调用PHP header函数时,您告诉服务器端的PHP向客户端的浏览器发送一个HTTP头。在标题“Location:…”的情况下,您正在发送一个HTTP标题,该标题会导致浏览器重定向到另一个页面并断开与当前PHP脚本的连接

这就是事件发生的过程:

PHP脚本发送HTTP头,根据延迟,浏览器可能需要一些时间来接收它。 浏览器将解释标头并重定向到您指定的位置,这还会向当前执行的PHP脚本发送一条断开连接消息。 同样,根据延迟,服务器从浏览器接收断开连接消息可能需要一些时间。 在PHP脚本发送头和接收断开连接消息之间,脚本仍在执行。在收到断开连接消息之前,无法判断脚本将执行多少代码,因此您根本无法依赖于此。这就是为什么你应该在发送标题时死亡

知道PHP头函数是如何工作的,你想把这个放进循环中的唯一原因是,如果你希望当前脚本在某个循环中停止执行,这取决于某个特定的条件。像这样:

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

    // do something as long as $var != "stop"
}
这将在$var数组中循环,直到到达值stop,此时它将向客户端发送重定向头并停止执行

与您的示例不同的是,在编辑它之前,您的循环包含单个if-else语句,并且在if和else中,您都有头重定向调用。所以不管怎样,它都会在循环的第一次迭代中发送,这是没有意义的。如果这是您真正想要的,那么就不会使用循环。它只执行一次,这违背了循环的目的

对于冗长的回答,我很抱歉,但希望您现在对代码中真正发生的事情有了更好的理解

字符串在sql查询中用“$string”撇号标记

$query=插入许可证EID,p类型值“$user”和“$cat”

您可以使用正确的连接初始化一个db对象$db,并在需要的地方使用它:请参阅

例如:

这只是一个简单的例子

字符串在sql查询中用“$string”撇号标记

$query=插入许可证EID,p类型值“$user”和“$cat”

您可以使用正确的连接初始化一个db对象$db,并在需要的地方使用它:请参阅

例如:


这只是一个原始示例。

首先,我不会将db连接放在循环中。第二,您是否遇到任何错误,是否已转储$cat_arr以查看它包含的内容?有几件事……首先,您不应该在循环中连接到数据库或断开与数据库的连接。这是不必要的开销。您应该在循环之前连接,然后断开连接。其次,我们看不出$med是什么。尝试这样做:var_dump$cat_arr;var_dump$med;在您的循环之前查看它包含的内容。@Travesty3抱歉,伙计们…我从来没有隐藏过整个代码…我已经添加了…您介意简要解释一下汽车垃圾场是为了什么吗??因为php手册网站不是很清楚……我不太明白。@Hubert:var\u dump基本上会输出变量的内容。这对于调试来说是非常好的。如果您对数组进行var_转储,它将吐出数组的内容。@Travesty3哦,谢谢,所以我添加了var_转储$cat_arr;低于$cat_arr=$_POST['cat'];对,或者我没有特别的地方要放?冷杉

t、 我不会把db连接放在循环中。第二,您是否遇到任何错误,是否已转储$cat_arr以查看它包含的内容?有几件事……首先,您不应该在循环中连接到数据库或断开与数据库的连接。这是不必要的开销。您应该在循环之前连接,然后断开连接。其次,我们看不出$med是什么。尝试这样做:var_dump$cat_arr;var_dump$med;在您的循环之前查看它包含的内容。@Travesty3抱歉,伙计们…我从来没有隐藏过整个代码…我已经添加了…您介意简要解释一下汽车垃圾场是为了什么吗??因为php手册网站不是很清楚……我不太明白。@Hubert:var\u dump基本上会输出变量的内容。这对于调试来说是非常好的。如果您对数组进行var_转储,它将吐出数组的内容。@Travesty3哦,谢谢,所以我添加了var_转储$cat_arr;低于$cat_arr=$_POST['cat'];对吧,或者我没有具体的地方需要放?好吧,从技术上来说,因为他没有死或退出,脚本将继续执行。但我同意应该将其移出循环。@Travesty3:header是否会在完成第一个foreach后立即重定向?它可以继续,但一旦浏览器接收到位置,它将断开连接,脚本将在该点停止执行。在这种情况下,看起来MySQL在接收下一个插入查询之前就会发生这种情况,特别是考虑到每次迭代都会创建一个新的db连接。伙计们……对不起,我的错误……我的意图是如果$med=='no',那么就转到标题“Location:medical_question.php';否则,请转到我尚未创建的下一页,但该页将告诉用户成功申请了许可证。@如果我想将该页设置为“Location:medical_question.php”标题,请使用MrCode;如果$med=='no',或者转到我尚未创建的下一个页面,但该页面将告诉用户许可证已成功申请。我应该把头放在哪里?好吧,从技术上讲,因为他没有死或退出,脚本将继续执行。但我同意应该将其移出循环。@Travesty3:header是否会在完成第一个foreach后立即重定向?它可以继续,但一旦浏览器接收到位置,它将断开连接,脚本将在该点停止执行。在这种情况下,看起来MySQL在接收下一个插入查询之前就会发生这种情况,特别是考虑到每次迭代都会创建一个新的db连接。伙计们……对不起,我的错误……我的意图是如果$med=='no',那么就转到标题“Location:medical_question.php';否则,请转到我尚未创建的下一页,但该页将告诉用户成功申请了许可证。@如果我想将该页设置为“Location:medical_question.php”标题,请使用MrCode;如果$med=='no',或者转到我尚未创建的下一个页面,但该页面将告诉用户许可证已成功申请。我应该把标题放在哪里?对不起,我对消毒部分有点困惑…你说的是把var_dump放对了??这是为了清理输入?不,var_dump是为了让您直观地查看和查看数组的内容。要清理用户输入,请使用mysql\u real\u escape\u字符串。阅读SQL注入的定义,以便更好地理解为什么必须对用户输入进行卫生处理。已理解!谢谢…我去阅读了更多关于mysql\u real\u escape\u字符串的php手册…哦,我能再问一件事吗??为什么变量周围必须有{}??对不起,如果这是一个noob qns…好的。我接着发布了一个SQL注入尝试的示例,因此您认识到了风险。括号{}不是必需的,我只是发现它们有助于识别字符串中变量名的边界。在这样的情况下,它会有所帮助:$variable=Hello$字符串={$variable}_world!;。如果你没有括号,这个世界!部分将连接到变量名,因此这有助于将变量名与字符串的其余部分分开。抱歉,我对清理部分有点困惑…你说的是将变量转储正确吗??这是为了清理输入?不,var_dump是为了让您直观地查看和查看数组的内容。要清理用户输入,请使用mysql\u real\u escape\u字符串。阅读SQL注入的定义,以便更好地理解为什么必须对用户输入进行卫生处理。已理解!谢谢…我去阅读了更多关于mysql\u real\u escape\u字符串的php手册…哦,我能再问一件事吗??为什么变量周围必须有{}??对不起,如果这是一个noob qns…好的。我接着发布了一个SQL注入尝试的示例,因此您认识到了风险。括号{}不是必需的,我只是发现它们有助于识别字符串中变量名的边界。在这样的情况下,它会有所帮助:$variable=Hello$字符串={$variable}_world!;。如果你没有括号,这个世界!部分将连接到变量名,因此这有助于将变量名与其余部分分开 绳子。