2011-04-09 5 views
3

Je travaille sur une fonctionnalité d'importation d'une base de données à une autre et j'ai pensé essayer les fonctions intégrées de Mysqli.Mysqli a préparé des instructions pour plusieurs bases de données

J'ai ouvert deux connexions, une pour chaque base de données, et je parcourt l'ancien (pour obtenir les utilisateurs existants) et exécute des contrôles sur le nouveau avant de choisir d'insérer ou non les données. Maintenant, je ne suis pas sûr si j'utilise mal la fonction des instructions préparées ou ce que j'ai de la difficulté à obtenir les bons résultats. Un cas de test simple est:

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

}

Ma première requête sur $oldDB fonctionne très bien et une boucle par les utilisateurs mais quand je regarde le user_id dans le $newDB avec la déclaration préparée, il ne retourne que le user_id du premier résultat.

Voici un exemple de sortie j'obtenir:

 
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) 

Est-ce que quelqu'un a une idée de ce que je fais mal? J'ai été à travers les docs Mysqli, mais je n'ai rien trouvé qui m'a aidé.

Répondre

2

Ok J'ai trouvé le problème, les choses fonctionnaient correctement mais il semble que la variable utilisée dans mysqli_stmt::bind_result() ne soit pas mise à jour à moins qu'une ligne ne soit trouvée. Dans mes tests, seul le premier utilisateur a été trouvé, ce qui a entraîné le retour du 1 à chaque fois.

mysqli_stmt::fetch() retournera NULL lorsqu'aucun résultats donc je devais simplement modifier mon code un peu comme ceci:

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

} 
Questions connexes