如何解决无法更新“日期列”的问题:更新MySQL数据库表时如何正确上传CSV文件
P粉529581199
P粉529581199 2023-08-28 13:46:51
0
1
403
<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;">&lt;?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”); while($ data = fgetcsv($ handle)){ $data_id = mysqli_real_escape_string($ connect,$ data [0]); $date = mysqli_real_escape_string($ connect,$ data [1]); //我的问题 $births = mysqli_real_escape_string($ connect,$ data [2]); $query =“UPDATE my_table SET date ='$ date', births ='$ births', WHERE data_id ='$ data_id'”; mysqli_query($ connect,$ query); } fclose($ handle); header(“location:index.php?updation = 1”); } else { $message ='&lt;label class =“text-danger”&gt;请仅选择CSV文件&lt;/label&gt;'; } } else { $message ='&lt;label class =“text-danger”&gt;请选择文件&lt;/label&gt;'; } } if(isset($ _GET [“updation”])){ $message ='&lt;label class =“text-success”&gt;产品更新完成&lt;/label&gt;'; } $query =“SELECT * FROM my_table”; $result = mysqli_query($ connect,$ query); ?&gt; &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;通过使用PHP上传CSV文件更新Mysql数据库&lt;/title&gt; &lt;script src =“https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js”&gt;&lt;/script&gt; &lt;link rel =“stylesheet” href =“https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css”/&gt; &lt;script src =“https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js”&gt;&lt;/script&gt; &lt;/head&gt; &lt;body&gt; &lt;br /&gt; &lt;div class =“container”&gt; &lt;h2 align =“center”&gt;通过使用PHP上传CSV文件更新Mysql数据库&lt;/a&gt;&lt;/h2&gt; &lt;br /&gt; &lt;form method =“post” enctype ='multipart/form-data'&gt; &lt;p&gt;&lt;label&gt;请选择文件(仅限CSV格式)&lt;/label&gt; &lt;input type =“file” name =“product_file”/&gt;&lt;/p&gt; &lt;br /&gt; &lt;input type =“submit” name =“upload” class =“btn btn-info” value =“上传”/&gt; &lt;/form&gt; &lt;br /&gt; &lt;?php echo $message; ?&gt; &lt;h3 align =“center”&gt;Birthss&lt;/h3&gt; &lt;br /&gt; &lt;div class =“table-responsive”&gt; &lt;table class =“table table-bordered table-striped”&gt; &lt;tr&gt; &lt;th&gt;日期&lt;/th&gt; &lt;th&gt;出生&lt;/th&gt; &lt;/tr&gt; &lt;?php while($ row = mysqli_fetch_array($ result)) { echo ' &lt;tr&gt; &lt;td&gt;'.$row [“date”].'&lt;/td&gt; &lt;td&gt;'.$row [“births”].'&lt;/td&gt; &lt;/tr&gt; '; } ?&gt; &lt;/table&gt; &lt;/div&gt; &lt;/div&gt; &lt;/body&gt; &lt;/html&gt;</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 학습자의 빠른 성장을 도와주세요!