PDA

View Full Version : سوال در مورد اکسل و php



persian-boy
دوشنبه 25 اردیبهشت 1391, 17:49 عصر
سلام دوستان

من یک اسکریپت مینویسم که اطلاعات دیتابیسش از اکسل گرفته میشه .

اکسل 2007ــه . باید اول به csv تبدیلش کنم . این مشکلی پیش نمیاره ؟ اطلاعات تغییری نمیکنه ؟ ( در تعداد بالا ) راه دیگه ای که جز این کار هست ؟

سوال دومم هم این هست که مثلا یک فایل اکسل 460 هزار خط داره ، مشکلی پیش نمیاد ؟ در پردازش و وارد کردن به دیتابیس ، چون باید به تعداد خط ها کوئری اینسرت داشته باشیم .

راه حلی ، پیشنهادی اگه هست واقعا ممنون میشم .

djsaeedkhan
دوشنبه 25 اردیبهشت 1391, 18:20 عصر
خوب اگر بخوای یک جا این همه رکورد رو اینسرت کنی که مشکل پیش میاد
باید بگردی تو فروم که چطور تیکه تیکه اطلاعات رو اینسرت کنی

persian-boy
دوشنبه 25 اردیبهشت 1391, 18:46 عصر
در مورد لیمیتی که فرمودید یک مثال میزنید ؟

persian-boy
دوشنبه 25 اردیبهشت 1391, 22:07 عصر
ببینید من میخوام insert انجام بدم ولی به تعداد زیاد .

از یک فایل تکست یا csv مقادیر رو میگیرم حدود 100 هزار تا

بعد میخوام اون رو وارد دیتابیس کنم .

5000 تاش حدود 2یا 3 دقیقه طول کشید و این یعنی افتضاح . البته روی پی سی شخصی
روال هم به این شکله که میندازمش داخل while و هر بار یک کوئری insert انجام میشه .

حالا چاره چیه ؟ لیمیت راه درستیه ؟ اگه آره ، به چه شکل ؟
یک مثال میزنید ؟

راه بهتری هست ؟

djsaeedkhan
دوشنبه 25 اردیبهشت 1391, 23:46 عصر
سلام
تو پست های ایجاد شده آقای شهرکی MMSHFE (http://barnamenevis.org/member.php?55504-MMSHFE) بگرد
قبلا درباره همین که شما میگی صحبت کردن
طبق سورس ایشون تا 700 مگ رو میشد در دیتابیس به تدریج درج کرد

اینم هست من قبلا پرسیده بودم
http://barnamenevis.org/showthread.php?336937-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%DA%A9%D8%AF%D9%87%D8%A7%DB%8C-%D8%AD%D8%AC%DB%8C%D9%85-%DA%86%D9%87-%DA%A9%D8%B1%D8%AF

persian-boy
دوشنبه 25 اردیبهشت 1391, 23:57 عصر
پیدا نکردم ، ای کاش خودشون به اینجا سر بزنن

djsaeedkhan
سه شنبه 26 اردیبهشت 1391, 00:00 صبح
http://barnamenevis.org/showthread.php?271787-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%88%D8%A7%D8%B1%D8%AF%D9%83%D8%B1%D8%AF%D9%86-%D9%81%D8%A7%D9%8A%D9%84%D9%87%D8%A7%D9%8A-%D8%AD%D8%AC%D9%8A%D9%85-MySQL-%D8%AF%D8%B1-DB-%D8%A8%D8%A7-%D9%83%D9%85%D9%83-AJAX

persian-boy
سه شنبه 26 اردیبهشت 1391, 00:14 صبح
ممنون از شما

این اسکریپت مربوط به فایل sql میشد . ولی فایل من csv هست .

persian-boy
سه شنبه 26 اردیبهشت 1391, 13:05 عصر
دوستان نظری ندارن ؟

Unique
سه شنبه 26 اردیبهشت 1391, 16:09 عصر
شما میتونید اول معادل sql برای csv بسازین و از همون سورس استفاده کنین ! البته من سورس ایشون را ندیدم اما مثلا میشه 500 تا insert را با یکبار اجرای دستور sql توی پایگاه ثبت کرد کلا از تک تک انجام دادن بپرهیزید و سعی کنید از mysqli استفاده کنید که اجازه اجرای چند دستور با هم را داره !

من نمیدونم کار شما چیه ولی به نظر من از یک سیستم shared خارجه و اگه من بودم از Virtual Server استفاده میکردم ! در این صورت کافیه csv را به sql تبدیل و بدین به mysql command تا فقط توی چند ثانیه کار را براتون انجام بده ! که هیچ چیزی سریعتر از این command وجود نداره ! باز هم میگم دستورات Insert را تک تک نگذارین و اینطوری بدین :

INSERT INTO tbl (col1, col2) VALUES ('val1', 'val2'), ('val3', 'val4'), ...

persian-boy
سه شنبه 26 اردیبهشت 1391, 16:24 عصر
خیلی خیلی ممنون از شما .

الان کد من به این شکله



if (($handle = fopen("book1.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
echo "<p> $num fields in line $row: <br /></p>\n";
$row++;
$a=$data['0'];
$b=$data['1'];
$query = mysql_query("INSERT INTO `code`(`code`, `msg`) VALUES ('$a','$b')");
if($query) { echo "Done";}else{echo "Error";}
}
fclose($handle);
}


به چه شکل میتونم به اون صورتی که شما عرض کردید انجام بدم ؟

مشکل اینه که چطور بگم که مثلا هر 500 تارو یکبار کوئری کنه ؟

یک توضیح در مورد این جملتون میدید ؟



در این صورت کافیه csv را به sql تبدیل و بدین به mysql command تا فقط توی چند ثانیه کار را براتون انجام بده ! که هیچ چیزی سریعتر از این command وجود نداره !

Unique
سه شنبه 26 اردیبهشت 1391, 20:01 عصر
شرمنده با عجله شد و باید خودتون یه چکش بکنی :

if (($handle = fopen("book1.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$a=$data['0'];
$b=$data['1'];
$q[] = "('$a','$b')";
if ((count($q) % 100) == 0){
$query = mysql_query("INSERT INTO `code`(`code`, `msg`) VALUES ".implode(",",$q));
$q = array();
}
}
if (count($q) > 0){
$query = mysql_query("INSERT INTO `code`(`code`, `msg`) VALUES ".implode(",",$q));

fclose($handle);
}



در این صورت کافیه csv را به sql تبدیل و بدین به mysql command تا فقط توی چند ثانیه کار را براتون انجام بده ! که هیچ چیزی سریعتر از این command وجود نداره !
همین حلقه را مینویسی ولی همشو میریزی توی یک فایل و اجرا نمیگیری ! بعدش این فایل را میدی به mysql command اینطوری :

$ mysql -u username -p -h localhost DATA-BASE-NAME < data.sql

persian-boy
پنج شنبه 28 اردیبهشت 1391, 13:52 عصر
خیلی ممنون از شما . اون مشکل هم حل شد

فقط الان یک مشکل دیگه دارم . اونم اینه که نوشته های فارسی در لوکال هاست به صورت کامل ایمپورت میشن ولی در هاست درست انجام نمیشه .
حتی انکدینگ رو هم عوض میکنم فرقی نمیکنه .

در لوکال تنها مشکلی که داشت این بود که با حرف "ی" مشکل داشت که حلش کردم با یک کوئری

این کدم



if(isset($_POST['submit'])) {
$c = intval($_POST['category']);
//Сheck that we have a file
if((!empty($_FILES["uploaded_file"])) && ($_FILES['uploaded_file']['error'] == 0)) {
//Check if the file is JPEG image and it's size is less than 350Kb
$filename = basename($_FILES['uploaded_file']['name']);
$ext = substr($filename, strrpos($filename, '.') + 1);
if (($ext == "csv")) {
//Determine the path to which we want to save this file
$newname = dirname(__FILE__).'/upload/'.$filename;
//Check if the file with the same name is already exists on the server
if (!file_exists($newname)) {
//Attempt to move the uploaded file to it's new place
if ((move_uploaded_file($_FILES['uploaded_file']['tmp_name'],$newname))) {
if (($handle = fopen("upload/".$filename, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$a=$data['0'];
$b=$data['1'];
$q[] = "('$a','$b','$c')";
if ((count($q) % 100) == 0){
$query = mysql_query("INSERT INTO `code`(`code`, `msg`, `pid`) VALUES ".implode(",",$q));
$q = array();
}
}
if (count($q) > 0){
$query = mysql_query("INSERT INTO `code`(`code`, `msg`, `pid`) VALUES ".implode(",",$q));
$query2 = mysql_query("UPDATE `code` SET `msg`=REPLACE(`msg`,'?','ی')");
echo " اطلاعات با موفقیت وارد شدند ";

fclose($handle);
}
}else{echo "مشکلی در خواندن فایل اکسل به وجود آمده است";}
} else {


echo "Error: A problem occurred during file upload!";
}
} else {
echo "Error: File ".$_FILES["uploaded_file"]["name"]." already exists";
}
} else {
echo "Error: Only .jpg images under 350Kb are accepted for upload";
}
} else {
echo "Error: No file uploaded";
}

}

persian-boy
پنج شنبه 28 اردیبهشت 1391, 20:47 عصر
دوستان میتونه مشکل از تنظیمات سرور باشه ؟ چون تو لوکال به بهترین شکل کار میکنه

Unique
پنج شنبه 28 اردیبهشت 1391, 22:06 عصر
شما در زمان اتصال به پایگاه این دستور را بلافاصله اجرا میکنید :

mysql_query('SET NAMES \'utf8\'');

Character Set پایگاه و جداول را بر روی unicode_persian تنظیم میکنید ؟
حتما از MySQL5 دارین استفاده میکنید ؟

persian-boy
جمعه 29 اردیبهشت 1391, 11:25 صبح
سلام مجدد

این چند روزه خیلی اذیتتون کردیم جناب Unique

من از اون کوئری بعد از اتصال به دیتابیس استفاده میکنم .

ادکدینگ هم روی utf8_general_ci هست .

ورژن Mysql ومپ 5.5.16 هست و ورژن Mysql سرور 5.0.67 هست .

نمیدونم ، خیلی گیج شدم . الان شما از کد من داخل لوکال استفاده کنید خیلی خیلی خوب جواب میده .

راه دیگه ای برای ایمپورت Excel به Mysql از طریق PHP نیست که 2007 رو پشتیبانی کنه و با فارسی مشکلی نداشته باشه ؟

persian-boy
جمعه 29 اردیبهشت 1391, 13:44 عصر
الان یک چیزی متوجه شدم . مشکل دیتابیس نیست. کلا وقتی var_dump میگیرم رو هاست ، عبارات فارسی رو نشون نمیده . یعنی داخل تک کوتیشن خالیه

persian-boy
جمعه 29 اردیبهشت 1391, 14:55 عصر
نمیشه از از fgetcsv استفاده نکنیم ؟

مثلا از این استفاده کنیم ؟




<?php
$file = file('test2.csv');
foreach($file as $key) {
var_dump(explode(',',$key));
}
?>



اگه میشه ، برای این کد هم عرض میکنید که چطور کوئری هارو تقسیم کنم ؟

خیلی خیلی ممنونم

Unique
شنبه 30 اردیبهشت 1391, 00:20 صبح
خیلی راه ها وجود داره ! من هم احتمال میدم مشکل از فایل یا زمانی هست که فایل را میخونید ! میتونید یک خط را بخونید و بعدش با explode آرایه data$ را به وجود بیارید ! تقسیمش هم همون کد کار میکنه ! فقط باید آرایه data$ را خودتون به وجود بیارید !

persian-boy
شنبه 30 اردیبهشت 1391, 14:16 عصر
ممنون حلش کردم . دستتون درد نکنه . از راهنمایی های شما استفاده کردم .

persian-boy
یک شنبه 31 اردیبهشت 1391, 12:31 عصر
یک مورد دیگه

در برخی از هاست ها محدودیت هایی رو به صورت پیشفرض اعمال کردند .

این پروسه بعضی اوقات حدود 5-6 دقیقه طول میکشه . چطور اجازه بدم اسکریپت بدون تایم اوت کارش رو انجام بده ؟
همین محدودیت فکر کنم برای آپلود فایل و ارسال اطلاعات به دیتابیس هم باید باشه

چطور میشه با php اینکار رو کرد . با ini_set باید بشه اگر اشتباه نکنم ، فقط مقادیری که باید ست بشه رو نمیدونم

پیشاپیش ممنون از راهنماییتون

Unique
یک شنبه 31 اردیبهشت 1391, 22:18 عصر
با تابع set_time_limit اگر php در حالت safe mode نباشه میتونید timeout را کنترل کنید.

houriaa
جمعه 19 خرداد 1391, 15:40 عصر
سلام دوستان
من می خوام یک فایل اکسل را باز کنم و بدون اینکه نمودار ها و داده هایی که فبلا توش بوده تغییر کنه یه سری ازلاعات بهش اضافه کنم و ببندمش. نمی دونم چجوری باید با php این کارو انجام بدم..میشه راهنمائیم کنید؟