PHP,预示着奇怪的行为

时间:2010-12-24 00:04:15

标签: php mysql

抱歉有限的标题。对我来说很容易,我在PHP方面不是很先进。

在我的functions.php中,我有以下2个函数来查看“收件人”或“发件人”是否已经存在。

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')");

    };  

鉴于我的vars,session和tablenames都存在且可用..这个循环或函数设置有什么问题?

问题出在foreach()中的最后一个查询中。链接表给出了各种疯狂的结果。

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

3 个答案:

答案 0 :(得分:1)

如果您正在使用mysqli(您应该使用),您的数据库对象可以自动获取ID。它更快(少了两次查找)并且瞬间完成。

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

$id_of_new_row = $conn->insert_id;

您可能会看到的内容(正如您在评论中提到的那样)是数据库仍处于写入状态,并且由于并发废话,您会看到缓存的响应(null)或其他一些不正确的值。如果您只是使用发布的两个函数获取正在查找的ID,那么发送额外的两个查询是没有意义的,所以将数据库对象切换到此方法并让我们知道它是如何进行的! / p>

答案 1 :(得分:0)

;

最后不需要。究竟是什么价值搞砸了?

编辑:

如果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')");
}

答案 2 :(得分:0)

有一点肯定看起来很奇怪的是,当没有地址时,你将$地址添加到数据库,而没有来自的地方则是$。

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

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行中的命令无论如何都会被执行

这看起来不像你想做的事,amirite?

所以,这是一系列条件句应该如何 - 如果我找到你的话:

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手册。