Написание PHP-файла для чтения из CSV и выполнения SQL-запросов - PullRequest
8 голосов
/ 02 июня 2009

Я бы хотел, чтобы скрипт PHP считывал содержимое из файла CSV в следующем формате

id, sku
1,104101
2,105213

всего имеется 1486 записей, я считаю, что лучше использовать цикл for вместо while! EOF.

После этого я хотел бы выполнить SQL-запрос к базе данных с именем m118, таблица catalog_product_entity.

Запрос будет выглядеть как UPDATE sku = $ csvSku WHERE id = $ csvId

Будучи новичком в PHP и MySQL, я не знаю, с чего начать кодирование.

Ответы [ 6 ]

11 голосов
/ 02 июня 2009

fgetcsv может использоваться для анализа файлов CSV. Метод mysql_query может использоваться для выполнения запросов MySQL.

Полный код выглядит следующим образом:

<?php
$fin = fopen('catalog_product_entity.csv','r') or die('cant open file');
$link = mysql_connect('localhost', 'm118', 'pw');
If (!$link) {
    die ('Could not connect: ' . mysql_error());
}
@mysql_select_db('m118') or die ('Unable to select database');
echo "Connection succeeded <br />\n";
while (($data=fgetcsv($fin,1000,","))!==FALSE) {
    $query = "UPDATE catalog_product_entity SET sku='$data[1]' WHERE entity_id='$data[0]'";
    mysql_query($query);
    echo "Record updated <br />\n";
    }
fclose($fin);
mysql_close();
?>
3 голосов
/ 02 июня 2009

Молодцы на учебе :)

Возможно, теперь вы должны узнать о PDO в PHP, так как это (на мой взгляд) лучший, самый безопасный и быстрый способ выполнения запросов MySQL в PHP:

<?php
$fin = fopen('catalog_product_entity.csv','r') or die('cant open file');
try {
    $link = new PDO('mysql:dbname=m118;host=localhost', 'm118', 'pw');
    echo 'Connection succeeded <br />' . PHP_EOL;
    $stmt = $db->prepare('UPDATE catalog_product_entity SET sku = :sku WHERE entity_id = :id');
    //Only give the length parameter if you **KNOW** that no line will be longer than that
    while (($data=fgetcsv($fin,1000,","))!==FALSE) {
        if ($stmt->execute(array(':sku' => $data[1], ':id' => $data[0]))) {
            echo 'Record updated <br />' . PHP_EOL;
        } else {
            $err = $stmt->errorInfo();
            echo 'Update Failed: ' . $err[2] . PHP_EOL;
        }
    }
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}
fclose($fin);

Скрипт PDO имеет следующие преимущества перед вашим:

  • Это безопаснее: PDO автоматически цитирует вставляемые данные по мере необходимости. Это предотвращает атаки с использованием SQL-инъекций.
  • Это быстрее: PDO кэширует запрос (в процессе подготовки), а затем использует параметры, переданные в execute.
  • Это портативное устройство: PDO может подключаться к различным типам БД, а не только к MySQL, поэтому, если вам нужно переключать БД, это намного проще.
3 голосов
/ 02 июня 2009

Вам нужно будет сделать что-то вроде:

$filename = "file_name_on_server.csv"
$fp = fopen( $filename ,"r");
while ($line = fgets ($fp))
{

теперь используйте Split , чтобы получить массив значений, разделенных запятыми

    $arr = split (",", $line);

Теперь у вас есть массив значений запятой в $ line. Вы можете сделать простое форматирование строки, чтобы вставить эти значения в запрос SQL.

    $query = "INSERT INTO `TableBlah` (Field1, Field2) VALUES (" . $arr[0] . "," . $arr[1] . ")";

Используйте mysql api для отправки этих запросов в базу данных

}
fclose($fp);
1 голос
/ 02 июня 2009

Хорошо, чувак, я не напишу код для тебя, потому что ты не научишься, если я это сделаю. Но я укажу вам в правильном направлении. Проверьте эту ссылку http://us.php.net/fgetcsv для получения информации о разборе файла CSV в PHP. Простой поиск в Google также должен предоставить вам необходимую информацию для ввода его в таблицу MySQL.

0 голосов
/ 18 августа 2009
<?php
include ("dbsanjog.php");
$uploadedfile=$_REQUEST['uploadedfile'];
  $target_path = "dataupload/";
  $user=$_REQUEST['username'];
$target_path = $target_path.$user.".csv"; 

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) 
{
    echo "The file ".  basename( $_FILES['uploadedfile']['name']). "has been uploaded";
} 

//echo $target_path; die;
//$row = 1;
$handle = fopen($target_path, 'r');
//$sql="update agents_det set where user='$user'";


while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
{
    $query = "UPDATE agents_det SET contact='$data[3]' WHERE user='$user'";   

}

fclose($handle);
//mysql_query($test);
//echo ($test[1]); die;
//echo $test; die;


?>
0 голосов
/ 02 июня 2009

Goblyn27 правильно. Посмотрите на fgetcsv () и mysql_query () на php.net. В документации есть даже примеры того, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...