2016-09-18 26 views
-2

Ich stieß auf ein Problem mit merkwürdigem Verhalten von mysqli_query. Es gibt eine foreach-Schleife, um Tabellenzeilen zu aktualisieren, aber das Update für die letzte Schleife wird nicht in die Datenbank geschrieben (alle anderen Aktualisierungen werden erfolgreich geschrieben). Es gibt keinen Fehler und mysqli_affected_rows gibt 1 wie es sollte zurück. Der Code durchläuft bis zum Ende, bestätigt durch eine Echo-Anweisung nach mysqli_query.Merkwürdiges Verhalten von mysqli_query

Ich habe versucht, ein Array mit nur einem Element und dem gleichen Problem zu durchlaufen.

Was geht hier vor? Ist jemand auf das gleiche Problem gestoßen?

OK ... hier ist der wesentliche Teil des Codes, der ganze Code ist nicht möglich, da dort maximal 30000 Zeichen erlaubt sind. Ich habe auch die Sql-Saite wiederholt und alles ist perfekt. Aber wie gesagt, das Update für die letzte Schleife (das letzte Mal wenn die Schleife ausgeführt wird) wird nicht in die MySQL-DB geschrieben.

$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

erstellen [Minimal, vollständig und überprüfbar Beispiel] (http://stackoverflow.com/help/mcve) – RiggsFolly

+0

ok..I'll zu sehen, was ich –

+0

tun kann, wenn alle anderen Updates ausführen, dann schlägt etwas fehl und einige Ihrer Spalten akzeptieren wahrscheinliche Null-/Leerwerte. Es ist schwer zu sagen, da wir keinen Code haben, mit dem wir arbeiten können. Sie müssen den gesamten relevanten Code und das Datenbankschema ebenfalls veröffentlichen. Es kann "still" ausfallen, weil die Spaltenlängen auch zu kurz sind. –

Antwort

1

Ich würde Debugging wie folgt in eine Textdatei ausführen. Wedge deine Datensammlung in die äußeren Schleifen, entferne das heraus und setze die inneren Blöcke auf Null. Eine Strategie zum Teilen und Herrschen.

Ich würde versucht haben, meinen Kopf in Ihre E-Mail PHP zu bekommen, aber es ist 675 Zeilen eines foreach-Block: 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; 
    } 
?> 

Beispielprotokolldatei (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 

Hinweis das letzte Update Anw gemeint war, also keine Daten ändern Sch betroffen = 0

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