2012-01-21 49 views
0

我正在尝试使用3个预处理语句插入和更新数据。有两个问题发生:使用多个mysqli预处理语句时的问题

1:SELECT COUNT查询检查记录是否存在LIMIT 1,结果存储在$ check中。但是,LIMIT 1似乎被忽略,例如当我有3行与SELECT COUNT中的WHERE条件匹配时,$ check返回3而不是1.

2:if((int)$ check < 1)语句有效,每当$ check = 0时,我会看到echo的输出,但是$ stmt_insert-> execute();和$ stmt_total-> execute();实际上并没有插入和更新数据库。

但是,当我注释掉:

$stmt_check->execute(); 
$stmt_check->bind_result($check); 
$stmt_check->fetch(); 

那么$ stmt_insert和$插入和更新stmt_total工程和行。我想知道是否有一种方法可以使所有三种语句正常工作,因为它似乎与我目前的设置发生了某种冲突。感谢您的时间。

下面是完整的代码:

$user_id = 100; 
$count = preg_match_all("#<li>(.*?)</li>#is", $html, $matches, PREG_SET_ORDER); 

$stmt_check = $mysqli->stmt_init(); 
$stmt_check->prepare("SELECT COUNT(`user_id`) AS `check` FROM `ua` WHERE `ach_class` = ? AND `user_id` = ? LIMIT 1"); 
$stmt_check->bind_param('si', $ach_class, $user_id); 

$stmt_insert = $mysqli->stmt_init(); 
$stmt_insert->prepare("INSERT INTO `ua` (`user_id`, `ach_class`, `time_log`) VALUES (?, ?, ?)"); 
$stmt_insert->bind_param('isi', $user_id, $ach_class, $ach_timestamp); 

$stmt_total = $mysqli->stmt_init(); 
$stmt_total->prepare("UPDATE `ach` SET `total` = `total` +1 WHERE `ach_class` = ? LIMIT 1"); 
$stmt_total->bind_param('s', $ach_class); 

for ($i = 0; $i < $count; $i++) { 
    $li_block = $matches[$i][1]; 
    preg_match('#img/(.*?)_60.png#is', $li_block, $class_matches); 
    $ach_class = $class_matches[1]; 
    $ach_class = substr($ach_class, 11, -11); 

    $ach_timestamp = time(); 

    $stmt_check->execute(); 
    $stmt_check->bind_result($check); 
    $stmt_check->fetch(); 
    echo $ach_class.' --- Check = '.$check.'<br />'; 

    if ((int)$check < 1) { 
     $stmt_insert->execute(); 
     echo 'insert<br />'; 

     $stmt_total->execute(); 
     echo 'update<br />'; 
    } else { 
     echo 'already present<br />'; 
    } 
} 

$stmt_insert->close(); 
$stmt_check->close(); 
$stmt_total->close(); 

回答

1
  1. 限制动作......这限制了返回的行数,和你返回1行只有一个字段(算了算),所以,限制在最终是没有意义的,因为它会返回单个结果。另外,为什么你的UPDATE命令中有LIMIT 1?
  2. 你可以使用INSERT ON DUPLICATE KEY UPDATE并在你的列上创建UNIQUE索引:ach_class,user_id,你会没事的。