2016-09-18 83 views
-2

我遇到了一个奇怪的mysqli_query行为问题。有一个foreach循环来更新表行,但最后一个循环的更新不会写入数据库(所有其他更新都会成功写入)。没有错误,mysqli_affected_rows返回1,因为它应该。代码一直持续到最后,由mysqli_query之后的echo-statement确认。mysqli_query的奇怪行为

我试图循环槽数组只有一个元素和相同的问题。

这是怎么回事?有没有人遇到同样的问题?

好的...这是代码的重要部分,整个代码是不可能的,因为最多允许有30000个字符。我也回应了sql-string,一切都很完美。但正如我所说的,最后一次循环的更新(循环最后一次执行时)并未写入MySQL-DB。

$sql_getRelations = "SELECT id_machine, device_id, serial_number, variant_id, company_id, last_file FROM view_machines " 
     . "WHERE company_id NOT IN ('" . implode('\',\'' , $btc_companies) . "') " 
//  . "AND id_machine = 158 " 
     . "AND device_type_id = 4 AND machine_status = 'active' " 
     . "ORDER BY id_machine ASC;"; 
$result_relations = mysqli_query($db_ed, $sql_getRelations); 
$relations_arr = mysqli_fetch_all($result_relations, MYSQLI_ASSOC); 
mysqli_free_result($result_relations); 

foreach($relations_arr as $machine){ 
    //...some other code here 
    $sql_update_device = "UPDATE device SET last_file = '" . $str_max_ts . "' WHERE id_device = " . $machine['device_id'] . ";"; 
    $update_device = mysqli_query($db_ed, $sql_update_device); 
    if (!$update_device) { 
     error_log("\r\n" . date("Y-m-d H:i:s") . ': !!!!Updatefehler device: ' . $machine['device_id'] . ": " . mysqli_error($db_ed), 3, "C:/xampp/htdocs/cronjob/error_log.txt"); 
    } 
    echo $machine['id_machine'] . ', '; 
} 
mysqli_close($db_ed); 
+0

创建[最小的,完整的和可验证的示例](http://stackoverflow.com/help/mcve) – RiggsFolly

+0

ok..I'll看看我能做些什么 –

+0

如果所有其他更新运行,那么某些内容会失败,并且某些列正在接受可能的空值/空值。由于我们没有合适的代码,因此很难说。你需要发布所有相关的代码和数据库模式。由于柱长太短,它可能会“无声”地失败。 –

回答

1

我会像下面这样对文本文件进行调试。在外部循环中楔入数据收集,然后将其删除,并将内部区块归零。分而治之的战略。

我会试图让我的头到您的电子邮件PHP的,但它是675线的foreach一个块的:P

PHP:

<?php 
    //mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 
    mysqli_report(MYSQLI_REPORT_ALL); 
    error_reporting(E_ALL); // report all PHP errors. 
    ini_set("display_errors", 1); 
    echo "start<br/>"; 

    // $file="/home/nate/debug123.txt"; 
    $file="c:\\nate\\debug123.txt"; 
    date_default_timezone_set('America/New_York'); 


    $debugStr=date('Y-m-d H:i:s').": Start"; 
    file_put_contents($file, $debugStr."\n", FILE_APPEND | LOCK_EX); 

    try { 
     $mysqli= new mysqli('localhost', 'theUser', 'thePassword', 'theDB_Name'); 
     if ($mysqli->connect_error) { 
      die('Connect Error (' . $mysqli->connect_errno . ') ' 
       . $mysqli->connect_error); 
     } 
     echo "I am connected and feel happy.<br/><br/>"; 

     $query = "INSERT INTO `t921`(`thing`,`uniqueNum`,`views`) values ('aaa',577,0)"; // change that 577 each time else it fails unique 
     echo $query."<br>"; 
     $mysqli->query($query); 
     $debugStr=date('Y-m-d H:i:s').": Affected rows: " .$mysqli->affected_rows.", Insert id: ".$mysqli->insert_id; 
     echo $debugStr."<br><br>"; 
     file_put_contents($file, $debugStr."\n", FILE_APPEND | LOCK_EX); 

     $query = "UPDATE `t921` SET `views`=`views`+1 WHERE id=1"; 
     echo $query."<br>"; 
     $mysqli->query($query); 
     $id=1; 
     $debugStr=date('Y-m-d H:i:s').": UPDATE id=".$id.", Affected rows: " . $mysqli->affected_rows; 
     echo $debugStr."<br><br>"; 
     file_put_contents($file, $debugStr."\n", FILE_APPEND | LOCK_EX); 

     $query = "UPDATE `t921` SET `views`=`views` WHERE id=1"; 
     echo $query."<br>"; 
     $mysqli->query($query); 
     $id=1; 
     $debugStr=date('Y-m-d H:i:s').": UPDATE id=".$id.", Affected rows: " . $mysqli->affected_rows; 
     echo $debugStr."<br><br>"; 
     file_put_contents($file, $debugStr."\n", FILE_APPEND | LOCK_EX); 

     $mysqli->close(); 
    } catch (mysqli_sql_exception $e) { 
     throw $e; 
    } 
?> 

样品日志文件(debug123.txt):

2016-09-19 18:23:57: Start 
2016-09-19 18:23:57: Affected rows: 1, Insert id: 27 
2016-09-19 18:23:57: UPDATE id=1, Affected rows: 1 
2016-09-19 18:23:57: UPDATE id=1, Affected rows: 0 

注意最后的更新语句是为了改变没有影响。因此= 0

SCH数据EMA:

create table t921 
( id int auto_increment primary key, 
    thing varchar(100) not null, 
    uniqueNum int not null, 
    views int not null, 
    unique key(uniqueNum) 
);