Mysqli为多个数据库准备了语句

时间:2011-04-09 09:08:31

标签: php mysqli prepared-statement

我正在从一个数据库到另一个数据库进行导入功能,并且我认为我会尝试内置的Mysqli功能。

我已经打开了两个连接,每个连接一个数据库,然后循环遍历旧连接(以获取现有用户)并在选择是否插入数据之前对新服务器运行检查。

现在我不确定我是否滥用预先准备好的陈述功能,或者我无法获得正确的结果。一个简单的测试用例是:

$oldDB = new Mysqli(HOST, USER, PASS, 'oldDB');
$newDB = new Mysqli(HOST, USER, PASS, 'newDB');

/*
 * Prepared statments
 */
$searchUserStmt = $newDB->prepare('SELECT user_id FROM members WHERE user_id=?');
$searchUserStmt->bind_param('i', $old_user_id);
$searchUserStmt->bind_result($user_id);

/**
 * Loop through users
 */
$result = $oldDB->query('SELECT * FROM member_profile LIMIT 10');
while($row = $result->fetch_assoc())
{

    var_dump($row['user_id']);

    // Check if user is already in DB
    $old_user_id = $row['user_id'];
    $searchUserStmt->execute();

    $searchUserStmt->fetch();
    $searchUserStmt->reset();
    var_dump($user_id);

}

我对$oldDB的第一个查询运行良好并循环遍历用户但是当我使用准备好的语句查找user_id中的$newDB时,它只返回user_id第一个结果。

以下是我得到的输出样本:

string(1) "1"
int(1)
string(2) "31"
int(1)
string(2) "26"
int(1)
string(3) "105"
int(1)
string(2) "34"
int(1)
string(3) "119"
int(1)
string(2) "36"
int(1)
string(2) "37"
int(1)
string(2) "38"
int(1)
string(2) "39"
int(1)

有谁知道我做错了什么?我经历过Mysqli文档,但没有找到任何帮助我的东西。

1 个答案:

答案 0 :(得分:2)

好的我发现了问题,事情正常工作但是mysqli_stmt::bind_result()中使用的变量似乎没有更新,除非找到了一行。在我的测试中,只找到了第一个用户,导致每次都返回1。

如果没有找到结果,

mysqli_stmt::fetch()将返回NULL,所以我只需稍微修改我的代码:

while($row = $result->fetch_assoc())
{

    var_dump($row['user_id']);

    // Check if user is already in DB
    $old_user_id = $row['user_id'];
    $searchUserStmt->execute();

    if($searchUserStmt->fetch() === NULL)
    {
        // Insert user here
    }
    $searchUserStmt->reset();

}