Mysqli подготовил заявления для нескольких баз данных - PullRequest
3 голосов
/ 09 апреля 2011

Я работаю над функцией импорта из одной базы данных в другую и решил попробовать встроенные функции 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 Ответ

2 голосов
/ 09 апреля 2011

Хорошо. Я обнаружил проблему, все работало правильно, однако кажется, что переменная, используемая в mysqli_stmt::bind_result(), не обновляется, если не найдена строка.В моих тестах был обнаружен только первый пользователь, в результате которого каждый раз возвращалась цифра 1.

mysqli_stmt::fetch() вернет NULL, когда не будет найдено результатов, поэтому мне просто пришлось немного изменить свой код так:1006 *

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();

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...