如何解決無法更新「日期列」的問題:更新MySQL資料庫表時如何正確上傳CSV文件
P粉529581199
P粉529581199 2023-08-28 13:46:51
0
1
536
<p>我的程式碼中的主要問題是我無法使用php將csv檔案中的「date」更新到mysql資料庫表中。程式碼行$ date = mysqli_real_escape_string($ connect,$ data [1]);是這裡的主要問題。我正在尋找這個特定程式碼行的任何替代查詢。 </p> <p>這是csv檔:https://drive.google.com/file/d/1EdMKo-XH7VOXS5HqUh8-m0uWfomcYL5T/view?usp=sharing</p> <p>這是完整的程式碼:</p> <pre class="brush:php;toolbar:false;"><?php //index.php $connect = mysqli_connect(“localhost”,“root”,“1234”,“ml_database”); $message =''; if(isset($ _POST [“upload”])){ if($ _FILES ['product_file'] ['name']){ $filename = explode(“。”,$ _FILES ['產品檔案'] ['名稱']); if(end($檔名)==“csv”){ $handle = fopen($ _FILES ['product_file'] ['tmp_name'],「r」); while($資料 = fgetcsv($句柄)){ $data_id = mysqli_real_escape_string($連接,$data[0]); $date = mysqli_real_escape_string($connect,$data[1]); //我的問題 $births = mysqli_real_escape_string($連接,$資料[2]); $query =“更新my_table SET日期='$日期', 出生數='$出生數', WHERE data_id ='$data_id'”; mysqli_query($連接,$查詢); } fclose($句柄); header(「位置:index.php?updation = 1”); } else { $message ='<label class =“text-danger”>請僅選擇CSV檔</label>'; } } else { $message ='<label class =“text-danger”>請選擇檔案</label>'; } } if(isset($ _GET [“updation”])){ $message ='<label class =“text-success”>產品更新完成</label>'; } $query =“SELECT * FROM my_table”; $result = mysqli_query($ connect,$ query); ?> <!DOCTYPE html> <html> <head> <title>透過使用PHP上傳CSV檔案更新Mysql資料庫</title> <script src =“https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js”></script> <link rel =“stylesheet” href =“https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css”/> <script src =“https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js”></script> </head> <body> <br /> <div class =“container”> <h2 align =“center”>透過使用PHP上傳CSV檔案更新Mysql資料庫</a></h2> <br /> <form method =“post” enctype ='multipart/form-data'> <p><label>請選擇檔案(僅限CSV格式)</label> <input type =“file” name =“product_file”/></p> <br /> <input type =“submit” name =“upload” class =“btn btn-info” value =“上傳”/> </form> <br /> <?php echo $message; ?> <h3 align =“center”>Birthss</h3> <br /> <div class =“table-responsive”> <table class =“table table-bordered table-striped”> <tr> <th>日期</th> <th>出生</th> </tr> <?php while($ row = mysqli_fetch_array($ result)) { echo ' <tr> <td>'.$row [“date”].'</td> <td>'.$row [“births”].'</td> </tr> '; } ?> </table> </div> </div> </body> </html></pre></p>
P粉529581199
P粉529581199

全部回覆(1)
P粉817354783

首先,您需要閱讀並丟棄CSV中的標題行。然後,使用適當的、準備好的和參數化的查詢,您可以正確地更新資料庫。由於.csv檔案中的日期格式正確,因此不需要進行任何操作,但是對於其他CSV檔案可能不是這種情況,通常需要在將日期正確儲存到表中之前對其進行重新格式化。

<?php
//index.php
$connect = mysqli_connect("localhost", "root", "1234", "ml_database");
$message = '';

if(isset($_POST["upload"])) {
    if($_FILES['product_file']['name']) {
        $filename = explode(".", $_FILES['product_file']['name']);

        if(end($filename) == "csv") {
            $handle = fopen($_FILES['product_file']['tmp_name'], "r");
            // 读取并忽略标题行
            $data = fgetcsv($handle, 1000, ",");

            // 准备查询一次
            $query = "UPDATE my_table 
                            SET date = ?, 
                                births = ?
                          WHERE data_id = ?";
            $stmt = $connect->prepare($query);

            // 循环遍历csv剩余的行
            while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                $stmt->bind_param('sss', $data[0],$data[1],$data[2]);
                $stmt->execute();
            }
            fclose($handle);
            header("location: index.php?updation=1");
            exit;   // 重定向后一定要使用exit
        } else {
            $message = '';
        }
    } else {
        $message = '';
    }
}

注意:我假設所有3列都是文字類型的。

$stmt->bind_param('sss', $data[0],$data[1],$data[2]);
                   ^^^

如果date_id是整數類型,您可以將其變更為'ssi',儘管3個s通常也能正常運作。

參考資料:

#fgetcsv
#mysqli_prepare
#mysqli_bind_param

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!