Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将CSV导入MySql,如果重复,更新所选值_Php_Mysql - Fatal编程技术网

Php 将CSV导入MySql,如果重复,更新所选值

Php 将CSV导入MySql,如果重复,更新所选值,php,mysql,Php,Mysql,我正在尝试将csv文件导入mysql数据库,我希望uploadscript检查是否存在重复项,如果发现任何重复项,则应更新该行,但仅更新选定的值。我希望它更新除“首次看到”之外的所有值。bssid是我唯一的标识符。我还得到一些建议,我应该把“addslashes”改成更好的代码,但我不知道哪种方法最好,有什么建议吗 <?php //Count ap´s before import $before = mysql_query("SELECT * FROM wifi"); $num_row

我正在尝试将csv文件导入mysql数据库,我希望uploadscript检查是否存在重复项,如果发现任何重复项,则应更新该行,但仅更新选定的值。我希望它更新除“首次看到”之外的所有值。bssid是我唯一的标识符。我还得到一些建议,我应该把“addslashes”改成更好的代码,但我不知道哪种方法最好,有什么建议吗

<?php 

//Count ap´s before import
$before = mysql_query("SELECT * FROM wifi");
$num_rows_before = mysql_num_rows($before);

if ($_FILES[csv][size] > 0) {

//get the csv file
$file = $_FILES[csv][tmp_name];
$handle = fopen($file,"r");

//loop through the csv file and insert into database
do {
    if ($data[0]) {
    $linesCount ++;
        mysql_query("INSERT INTO wifi (bssid, channel, privacy, ciper, auth, power, essid, latitude, longitude, first_seen, last_seen) VALUES
            (
                '".addslashes($data[0])."',
                '".addslashes($data[1])."',
                '".addslashes($data[2])."',
                '".addslashes($data[3])."',
                '".addslashes($data[4])."',
                '".addslashes($data[5])."',
                '".addslashes($data[6])."',
                '".addslashes($data[7])."',
                '".addslashes($data[8])."',
                '".addslashes($data[9])."',
                '".addslashes($data[10])."' 
            )
        ");
    }
} while ($data = fgetcsv($handle,1000,","));

//redirect
header('Location: index.php/ladda-upp?success=1&before=' . $num_rows_before); die;

}

//Catch argument from url
$arg_bef=$_GET['before'];

//Count ap´s after import
$after = mysql_query("SELECT * FROM wifi");
$num_rows_after = mysql_num_rows($after);

//Count new rows
$new_rows = $num_rows_after - $arg_bef;

//generic success notice
if (!empty($_GET[success])) { echo "<br><b>Resultat: Din fil har blivit importerad!</b><br><br>"; 

//echo stats
echo "Antal före import - ";
echo "$arg_bef";
echo "<br>";
echo "Antal efter import - ";
echo "$num_rows_after";
echo "<br>";
echo "Antal nya rader - ";
echo "$new_rows";
echo "<br>";
echo "Rader i CSV-fil - ";
} 

//Close connection to databse
mysql_close($connect) ; 

?>

您想要mysql的
复制键功能

确保在CSV中显示的字段上设置了密钥,例如:bssid可能会工作


使用mysql\u real\u escape\u string()代替addslashes(),但毫无疑问,有人会指出mysql\u函数已被弃用,很快将被删除,因此您至少应该使用mysqli。

备选方案:
替换为
的行为与插入到的行为完全相同,当遇到重复的唯一值时,它会执行<代码>更新>代码>。然后您可以使用
INSERT-INTO。。。。在重复密钥更新时,col1=something,col2=somethingElse,col3=…
我使用bssid作为重复密钥。使用“重复密钥更新时…”解决了此问题。非常感谢。使用:在重复密钥上更新bssid=values(bssid),channel=values(channel),等等来解决它。谢谢