使用mysqli检查另一个表中是否存在行

时间:2014-09-20 11:27:43

标签: php mysql mysqli

我试图在一个表中选择一行,如果它确实存在于第二个表中,则执行某些操作,如果不存在,则将表1中的值复制到第二个表中。

问题是,一旦找到匹配(第一个和第二个表中存在的行),它就会显示所有其他不匹配的行的错误。

这是错误

Notice: Trying to get property of non-object in C:\wamp\www\loans.php on line 26

这是我的代码

<?php
//error_reporting(0);
$mysqli = new mysqli("localhost", "root", "123456", "test");

/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}

$query = "select dest_msisdn,text_message,service_id,sender_name from incoming_sms";

if ($result = $mysqli->query($query)) {

    /* fetch associative array */
    while ($row = $result->fetch_assoc()) {

        $dest_msisdn = $row['dest_msisdn'];
        $text_message = $row['text_message'];
        $service_id = $row['service_id'];
        $sender_name = $row['sender_name'];

        /**
        Transactions
        */
        $m = $mysqli->query("SELECT tel from transactions where tel = $dest_msisdn")->fetch_object()->message;

        if(empty($m)){
        $ti = "insert into transactions(message,tel) values($text_message,$dest_msisdn)";
        $mysqli->query($ti);
        }
    }

    /* free result set */
    $result->free();
}

/* close connection */
$mysqli->close();
?>

我想插入在表1中找到的行,而不是在表2中。

3 个答案:

答案 0 :(得分:0)

当你按照你所假设的那样连锁时,总会有一排。如果没有一行,你就无法从中得到财产。这就是你得到错误的原因。所以做这样的事情:

$r = $mysqli->query("SELECT tel from transactions where tel = $dest_msisdn");
if ($r->num_rows == 0) {
    $ti = "insert into transactions(message,tel) values($text_message,$dest_msisdn)";
    $mysqli->query($ti);
}

答案 1 :(得分:0)

我建议您在访问结果产生的任何属性之前检查所产生的行:

$m = $mysqli->query("SELECT tel, message from transactions where tel = $dest_msisdn");
               // hi! im missing  ^^
// you are accessing the property "message" but its not a selected column in your query
if($m->num_rows <= 0) {
    $ti = "insert into transactions(message,tel) values($text_message,$dest_msisdn)";
    $mysqli->query($ti);
}

答案 2 :(得分:0)

这不会直接回答您的问题,但它会解决您的问题并可能解决其他问题。

你要插入的方式(首先是SELECT,然后在PHP中循环结果,然后是SELECT从另一个表,然后是INSERT)似乎不必要地复杂。您可以摆脱PHP循环,只需在单个SQL语句中执行INSERT,而无需所有PHP开销。让你的数据库为你工作。

所有这一切:

$query = "select dest_msisdn,text_message,service_id,sender_name from incoming_sms";

if ($result = $mysqli->query($query)) {

    /* fetch associative array */
    while ($row = $result->fetch_assoc()) {

        $dest_msisdn = $row['dest_msisdn'];
        $text_message = $row['text_message'];
        $service_id = $row['service_id'];
        $sender_name = $row['sender_name'];

        /**
        Transactions
        */
        $m = $mysqli->query("SELECT tel from transactions where tel = $dest_msisdn")->fetch_object()->message;

        if(empty($m)){
        $ti = "insert into transactions(message,tel) values($text_message,$dest_msisdn)";
        $mysqli->query($ti);
        }
    }

    /* free result set */
    $result->free();

可以改为:

$mysqli->query("INSERT INTO transactions(message,tel) SELECT text_message, tel FROM transactions INNER JOIN incoming_sms on transactions.tel = incoming_sms.dest_msisdn")