2011-08-09 128 views
1

我需要优化脚本以获得高性能,所以问题是如何将mysql多查询添加到此代码中?php,mysql多查询

foreach($multiContent as $htmlContent) { 
    $email = urldecode($email['1']); 
    $user = $user['1']; 

    //store in db 
    $db->query("UPDATE eba_users 
        SET mail = '$email' 
       WHERE username = '$user'"); 
    //echo "email is $email and user is $user\n"; 
    } 

    //close if ($array_counter % 200 
    unset($array_counter); 
    unset($data); 
} 

+0

你能解释一下你真正想做什么吗? – Phil

+0

@Phil,在foreach语句中有一个大约200个“用户名”和邮件的循环,所以我们只运行200个SQL语句,我只想运行一个更大的语句。我认为可以用多个查询来完成,米不是很有经验的MySQL ..希望这会提高性能/延迟 – Michael

+0

什么是“多查询”?如果您的意思是在一次调用中执行多个语句,则无法使用任何PHP MySQL库执行此操作。你最好使用准备好的陈述,如迈克的回答下面 – Phil

回答

2

如果您使用的mysqli或PDO已经,你应该用你的查询准备语句,因为他们的支持。由于整个查询不需要再次发送到数据库服务器,因此性能也会略有增加。然而,最大的优势是准备报表提供的安全性增加。

除此之外,尝试在username上添加索引以加快此查询,如果您还没有。

编辑: 如果你想做到这一切在一个查询中,你似乎暗示,你也可以使用ON DUPLICATE KEY UPDATE所提到的回答为this question

INSERT INTO eba_users (`username`, `mail`) 
VALUES 
    ('username1','$email1'), 
    ('username2','$email2'), 
    ('username3','$email3'), 
    ('username4','$email4'), 
    .... 
    ('usernameN','$emailN'), 
ON DUPLICATE KEY UPDATE `mail`=VALUES(mail); 

但是这可能不会像就像使用准备好的语句一样使用常规的UPDATE

EDIT2:按照要求,这里大概是你应该做的参数绑定中的mysqli什么非常近似:

if ($stmt = $mysqli->prepare("UPDATE eba_users SET mail= ? WHERE username= ?")) { 

    /* loop through array of users */ 
    foreach ($array as $username => $newemail) { 

     /* bind parameters for markers */ 
     $stmt->bind_param("ss", $newemail, $username); 

     /* execute query */ 
     $stmt->execute(); 
    } 
} 

当然,这并不提供任何错误消息的情况下,该失败。为此,你可以看看mysqli :: error

+0

已更新我的回答 – Mike

+0

你可以将我的查询转换为准备好的语句:)?我一直试图让它工作,但我得到一些bind()错误。我有|字段|类型|空| Key |默认|额外| + ------------- + -------------- + ------ + ----- + ------ ------ --- + ---------------- + | id | int(1)| NO | PRI | NULL | auto_increment | |用户名| varchar(208)|是| UNI | NULL | | |状态| int(1)|是| | 0 | | |邮件| varchar(65)|是| | NULL | | – Michael

+0

你使用mysqli还是pdo? – Mike