PHP,foreach奇怪的行为
很抱歉标题有限。别客气,我的PHP还不太高级 在my functions.php中,我有以下两个函数来查看“接收者”或“发送者”是否已经存在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
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:我不太明白你的意思。你只是说这是个小错误,不应该把事情搞砸?没错,乔纳。当然,你是对的,它不应该在那里。这是一个清楚的解释