Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP,foreach奇怪的行为_Php_Mysql - Fatal编程技术网

PHP,foreach奇怪的行为

PHP,foreach奇怪的行为,php,mysql,Php,Mysql,很抱歉标题有限。别客气,我的PHP还不太高级 在my functions.php中,我有以下两个函数来查看“接收者”或“发送者”是否已经存在 function getSenderId($fromAddress){ global $database; $check = $database->query("SELECT * FROM custMod_senders WHERE email = '$fromAddress'"); if($check->fetchRo

很抱歉标题有限。别客气,我的PHP还不太高级

在my functions.php中,我有以下两个函数来查看“接收者”或“发送者”是否已经存在

function getSenderId($fromAddress){
    global $database;
    $check = $database->query("SELECT * FROM custMod_senders WHERE email = '$fromAddress'");
    if($check->fetchRow() > 0){
        $id = $check->fetchRow();
        return $id['id'];       
    }else{
        return 0;
    }
}

function getReceiverId($toAddress){
    global $database;
    $check = $database->query("SELECT * FROM custMod_receivers WHERE email = '$toAddress'");
    if($check->fetchRow() > 0){
        $id = $check->fetchRow();
        return $id['id'];       
    }else{
        return 0;
    }
}
现在在我的脚本中,我有以下内容

$from = $_SESSION['fromAddress'];
$to = $_SESSION['addresses'];
$std = $_SESSION['possibleStd'];

    if (!is_array($to)){
        $to = array($to);       
    }



foreach($to as &$address) { 

        if(getReceiverID($address) == 0){
            echo 'receiver not found';
            $database->query("INSERT INTO custMod_receivers (email, possibleStd) VALUES ('$address', '$std')");

        }

        if(getSenderID($from) == 0){
            echo 'sender not found';
            $database->query("INSERT INTO custMod_senders (email) VALUES ('$from')");

        }

        $send_id = getSenderID($from);
        $receive_id = getReceiverID($address);

        $database->query("INSERT INTO custMod_lt_send_rec (send_id, receive_id) VALUES ('$send_id', '$receive_id')");

    };  
鉴于我的变量、会话和表名都存在且可用。。这个循环或函数设置有什么问题

问题出在foreach()中的de last查询中。链接表给出了各种疯狂的结果

编辑:问题是数据库中的结果重复、不完整或丢失。好像我的2个函数给出了错误的结果

;
最后是不需要的。例如,哪些价值观被打乱了

编辑:

如果from不是数组,那么这应该减少不必要的查询数量

$send_id = getSenderID($from);
if(getSenderID($from) == 0){
    echo 'sender not found';
    $database->query("INSERT INTO custMod_senders (email) VALUES ('$from')");
    $send_id = $from;
}

foreach($to as $address){  
    $receive_id = getReceiverID($address);
    if($receive_id == 0){
        echo 'receiver not found';
        $database->query("INSERT INTO custMod_receivers (email, possibleStd) VALUES ('$address', '$std')");
        $receive_id = $address;
    }

    $database->query("INSERT INTO custMod_lt_send_rec (send_id, receive_id) VALUES ('$send_id', '$receive_id')");
}
最后是不需要的。例如,哪些价值观被打乱了

编辑:

如果from不是数组,那么这应该减少不必要的查询数量

$send_id = getSenderID($from);
if(getSenderID($from) == 0){
    echo 'sender not found';
    $database->query("INSERT INTO custMod_senders (email) VALUES ('$from')");
    $send_id = $from;
}

foreach($to as $address){  
    $receive_id = getReceiverID($address);
    if($receive_id == 0){
        echo 'receiver not found';
        $database->query("INSERT INTO custMod_receivers (email, possibleStd) VALUES ('$address', '$std')");
        $receive_id = $address;
    }

    $database->query("INSERT INTO custMod_lt_send_rec (send_id, receive_id) VALUES ('$send_id', '$receive_id')");
}
如果您使用的是mysqli(您应该这样做),那么您的数据库对象可以自动获取id。它更快(减少两次查找)而且是即时的

$conn = new mysqli("localhost", "username", "password");
$conn->query("INSERT BLAH BLAH BLAH");

$id_of_new_row = $conn->insert_id;
您可能会看到(正如您在评论中提到的)数据库仍在写入,并且您会看到缓存响应(null)或由于无并发性而导致的其他一些不正确的值。但是,当您可以通过发布的两个函数获取正在查找的ID时,再发送两个查询是没有意义的,所以请将您的DB对象切换到这个方法,并让我们知道它是如何运行的

如果您正在使用mysqli(您应该这样做),那么您的数据库对象可以自动获取id。它更快(减少两次查找)而且是即时的

$conn = new mysqli("localhost", "username", "password");
$conn->query("INSERT BLAH BLAH BLAH");

$id_of_new_row = $conn->insert_id;

您可能会看到(正如您在评论中提到的)数据库仍在写入,并且您会看到缓存响应(null)或由于无并发性而导致的其他一些不正确的值。但是,当您可以通过发布的两个函数获取正在查找的ID时,再发送两个查询是没有意义的,所以请将您的DB对象切换到这个方法,并让我们知道它是如何运行的

一件看起来很奇怪的事情是,在没有地址的情况下将$address添加到数据库中,而在没有from的情况下将$from添加到数据库中

详细伪代码中的结构,以帮助您理解:

if there is no receiver                                1
   then put the receiver intoto the database           2
if there is no sender                                  3
   then put the sender into the database               4
anyway                                                 5
   put both in the database                            6
因此,如果其中一个元素存在,它将在db中复制它(第6行);如果未设置任何字符串,则会将空字符串放入数据库中,因为第6行中的命令仍会执行

这看起来不像你想做的事,阿米丽特

所以,这一系列条件从句应该是这样的-如果我得到了你:

if ((getSenderID($from)) and (getReceiverID($address)) {
   //code to put both into the db
}
elseif ((getSenderID($from)) {
   //code to put the sender only
}
else {
   //code to put the receiver only
}

另外,您可能想看看一些php手册中的条件语句。

有一件事情看起来很奇怪,那就是在没有地址的情况下将$address添加到数据库中,在没有from的情况下将$from添加到数据库中

详细伪代码中的结构,以帮助您理解:

if there is no receiver                                1
   then put the receiver intoto the database           2
if there is no sender                                  3
   then put the sender into the database               4
anyway                                                 5
   put both in the database                            6
因此,如果其中一个元素存在,它将在db中复制它(第6行);如果未设置任何字符串,则会将空字符串放入数据库中,因为第6行中的命令仍会执行

这看起来不像你想做的事,阿米丽特

所以,这一系列条件从句应该是这样的-如果我得到了你:

if ((getSenderID($from)) and (getReceiverID($address)) {
   //code to put both into the db
}
elseif ((getSenderID($from)) {
   //code to put the sender only
}
else {
   //code to put the receiver only
}

另外,您可能想看看一些php手册中的条件语句。

美元会话['addresses']来自哪里?它实际上是一个数组吗?为什么在&$address前面有一个&infort?如果您的输入可能包含许多项,那么如果您只在每条语句中插入一项,那么插入这些项可能需要很长时间。@James:从PHP5开始,foreach中的
&
表示通过引用传递,因此如果您更改
$address
,则会在数组中更改它。但这似乎不是问题所在,因为$address没有被编辑的地方。但是@typelj:你应该删除它,这是一种意外击中自己脚的好方法。从更有javascript经验的角度来看,似乎插入数据库的时间太长了。就像脚本一样,无法读取已经设置的值,并且会设置两次。链接表得到的是空值,其他的是双值。我不太明白。美元会话['addresses']是从哪里来的?它实际上是一个数组吗?为什么在&$address前面有一个&infort?如果您的输入可能包含许多项,那么如果您只在每条语句中插入一项,那么插入这些项可能需要很长时间。@James:从PHP5开始,foreach中的
&
表示通过引用传递,因此如果您更改
$address
,则会在数组中更改它。但这似乎不是问题所在,因为$address没有被编辑的地方。但是@typelj:你应该删除它,这是一种意外击中自己脚的好方法。从更有javascript经验的角度来看,似乎插入数据库的时间太长了。就像脚本一样,无法读取已经设置的值,并且会设置两次。链接表得到的是空值,其他的是双值。我不能完全把手指放在上面。这会产生一个被忽略的空语句,所以它不会改变任何东西。我是说它不需要。并不是说它会改变什么。我们仍然不知道“各种疯狂的结果”到底是什么。@Femaref:我不太明白你的意思。你只是说这是个小错误,不应该把事情搞砸?没错,乔纳。当然,你是对的,它不应该在那里。这会产生一个被忽略的空语句,所以它不会改变任何东西。我是说它不需要。并不是说它会改变什么。我们仍然不知道“各种疯狂的结果”到底是什么。@Femaref:我不太明白你的意思。你只是说这是个小错误,不应该把事情搞砸?没错,乔纳。当然,你是对的,它不应该在那里。这是一个清楚的解释