PDA

View Full Version : چگونه با php برای mysql جدول بسازیم؟



armintirand
سه شنبه 30 فروردین 1390, 20:31 عصر
سلام من میخوام یک اسکریپت بنویسم که کاربر بتونه برای وارد کردن اطلاعات از اون استفاده کنه.الگوریتم به این صورته که اسکریپت باید برای هر کاربر یک جدول درون دیتابیس مورد نظر بسازه ولی هر چی گشتم دستوری برای اجرای
create table example
از طریق php
پیدا نکردم اگه ممکنه یک نمونه سورس کوچیک برای این کار برام بفرستین ممنون میشم

sargardoon
چهارشنبه 31 فروردین 1390, 01:25 صبح
سلام من میخوام یک اسکریپت بنویسم که کاربر بتونه برای وارد کردن اطلاعات از اون استفاده کنه.الگوریتم به این صورته که اسکریپت باید برای هر کاربر یک جدول درون دیتابیس مورد نظر بسازه ولی هر چی گشتم دستوری برای اجرای
create table example
از طریق php
پیدا نکردم اگه ممکنه یک نمونه سورس کوچیک برای این کار برام بفرستین ممنون میشم

دوست عزیز اگر متوجه منظورتون شده باشم میتونید از این روش استفاده کنید برای مثال:


$sql = "CREATE TABLE `login` (
`id` INT(11)
,`name_fist` VARCHAR(20) not null
,`name_last` VARCHAR(20) not null
,`age` INT(3)
,PRIMARY KEY(`id`)
);";

$query = mysql_query($sql);

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

armintirand
چهارشنبه 31 فروردین 1390, 08:11 صبح
درسته.ولی من میخوام کاربر بتونه اسم جدول رو مشخص کنه.یعنی به جای login از $login استفاده کنم.
برای اون چیکار کنم

MSN_Issue
چهارشنبه 31 فروردین 1390, 08:30 صبح
توی همون دستور بالا چون از " استفاده کردند میتونید $login بذارید

eshpilen
چهارشنبه 31 فروردین 1390, 09:20 صبح
هرجا ورودی کاربر رو در یک کوئری بکار میبرید اون رو برای جلوگیری از SQL Injection امن کنید.

حالا یه نکتهء جالب در اینجا! بنظر شما چطوری باید جلوی SQL Injection رو در این مورد خاص بگیریم؟
با کاربرد تابع mysql_real_escape_string؟

armintirand
شنبه 03 اردیبهشت 1390, 17:28 عصر
من این کد رو با استفاده از گفته های شما نوشتم ولی جدول رو تو ی دیتابیسtest نمیسازه

?php
$link = mysql_connect('localhost','root','123456','test');
if(!$link){
die('Not connected: ');
}
$sql = "CREATE TABLE `login` (
`id` INT(11)
,`name_fist` VARCHAR(20) not null
,`name_last` VARCHAR(20) not null
,`age` INT(3)
,PRIMARY KEY(`id`)
);";
$query = mysql_query($sql,$link);
if($quary) echo "table created";
?>
اسم دیتابیسم test است
میشه اشکالشو برام توضیح بدید؟
ممنون

sargardoon
شنبه 03 اردیبهشت 1390, 18:10 عصر
من این کد رو با استفاده از گفته های شما نوشتم ولی جدول رو تو ی دیتابیسtest نمیسازه

?php
$link = mysql_connect('localhost','root','123456','test');
if(!$link){
die('Not connected: ');
}
$sql = "CREATE TABLE `login` (
`id` INT(11)
,`name_fist` VARCHAR(20) not null
,`name_last` VARCHAR(20) not null
,`age` INT(3)
,PRIMARY KEY(`id`)
);";
$query = mysql_query($sql,$link);
if($quary) echo "table created";
?>
اسم دیتابیسم test است
میشه اشکالشو برام توضیح بدید؟
ممنون

اینطوری بنویس


<?php
$link = mysql_connect('localhost','root','123456') or die('Not connected: ');;
mysql_select_db('test', $link) or die("database not selected");
$sql = "CREATE TABLE `login` (
`id` INT(11)
,`name_fist` VARCHAR(20) not null
,`name_last` VARCHAR(20) not null
,`age` INT(3)
,PRIMARY KEY(`id`)
);";
$query = mysql_query($sql);
if (mysqli_affected_rows)
echo "table created";
else
echo "check your query";
?>

موفق باشید.

armintirand
دوشنبه 05 اردیبهشت 1390, 23:40 عصر
من این کد شما رو روی لوکال هاستم اجرا کردم بعد اومدم تو خود مای اس کیو ال نگاه کردم دیدم جدول رو ساخته بعد از طریق خود مای اس کیو ال پاکش کردم بعد دوباره اسکریپت شمارو اجرا کردم ولی دیگه کار نمیکنه هر کار میکنم جدول رو نمیسازه ولی تو شرط خود اسکریپت که چک میکنه میگه جدول ساخته شد. به نظرتون مشکل از کجاست؟

MMSHFE
سه شنبه 06 اردیبهشت 1390, 08:23 صبح
با سلام، اين دستور رو تست كنيد:


<?php
$link = mysql_connect('localhost','root','') or die('Not connected: ');;
mysql_select_db('test', $link) or die("database not selected");
$sql = "DROP TABLE IF EXISTS `login`;
CREATE TABLE `login` (
`id` INT(11)
,`name_fist` VARCHAR(20) not null
,`name_last` VARCHAR(20) not null
,`age` INT(3)
,PRIMARY KEY(`id`)
);";
$query = mysql_query($sql);
if (mysqli_affected_rows)
echo "table created";
else
echo "check your query";
?>

اميدوارم مشكلتون برطرف بشه.
موفق باشيد.

armintirand
جمعه 23 اردیبهشت 1390, 16:39 عصر
اقا ممنون از کد شما ولی اگه حالا کاربر یک داده فارسی وارد کنه و اونو بخواییم ذخیره کنیم چطور یونیکد رو ذخیره کنم و اگه داده هامون هم فارسی هم انگلیسی باشه فرقی میکنه؟

sonia_1368
یک شنبه 25 اردیبهشت 1390, 09:47 صبح
ميشه توضيح بدين که اين نيازمندی برای ساخته شدن جدول توسط کاربر از کجا به وجود اومده ؟

armintirand
یک شنبه 25 اردیبهشت 1390, 15:00 عصر
ممنون که سوالمو با سوال جواب دادین.
ببینید من یک فرم ورود داده دارم که هر کاربری که داده های مربوط به خودش رو وارد میکنه باید یک جدول ساخته بشه و اطلاعات اون توی اون جدول قرار بگیره و کاربر بعدی در جدول بعدی ولی اصلا سوال من روی این نیست من الان دارم یک کلمه میگم اونم اینه: یونیـــــــــــــــــــــ ــکــــــــــــــــــــــ ــد. بابا یکی بیاد کامل توضیح بده تموم بشه الان تو خیلی از سایتها این سوال پرسیده شده و اساتیدی مثل شما با سوالاتی که به این سوال بند کردن مانع رسیدن جواب اصلی شدن.
من فقط میخوام بدونم داده فارسی که کاربر وارد میکنه چطور توی جدولم قرار بدم و اگه وسط کار یک داده انگلیسی هم وارد شد مشکلی پیش نمیاد؟

eshpilen
دوشنبه 26 اردیبهشت 1390, 19:11 عصر
من فقط میخوام بدونم داده فارسی که کاربر وارد میکنه چطور توی جدولم قرار بدم و اگه وسط کار یک داده انگلیسی هم وارد شد مشکلی پیش نمیاد؟
صفحه رو بوسیلهء هدرها و متاتگ های مناسب روی حالت UTF-8 قرار بدید.
ستون جدول شما هم که داده های متنی کاربر رو درش ذخیره میکنید باید انکدینگ UTF-8 داشته باشه (موقع تعریف/ایجاد جدول باید تعیین کنید).
بعد از هر اتصال به دیتابیس و قبل از اجرای کوئری ها هم، فرمان زیر رو به MySQL بدید:

SET NAMES 'utf8'

armintirand
سه شنبه 27 اردیبهشت 1390, 10:12 صبح
ممنون از پاسختون ولی متاسفانه منبع آموزشی من و خیلی از منابع دیگه که توی اینترنت هستند دستور تعریف انکدینگ رو معرفی نکردند و من خود اون دستور رو نمیدونم یعنی اگه امکان داشته باشه مثل کد دومی که تو صفحه قبل هست یک کد کامل بدید تا بتونم متوجه کل مطلب بشم.الان به خاطر این انکدینگ نزدیک 2ماهه کارم لنگ مونده.
ممنون

MMSHFE
سه شنبه 27 اردیبهشت 1390, 10:23 صبح
با سلام، كد زير رو در قسمت HEAD صفحه قرار بدين:


<META http-equiv="content-type" content="text/html; charset=utf-8"/>
و صفحه رو موقع ذخيره سازي با كدگذاري UTF-8 withou BOM ذخيره كنيد.
براي ارسال دستوري كه گفته شد به MySQL هم از دستور زير بعد از mysql_select_db استفاده كنيد:


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

موفق باشيد.

Mahdi.Spirit
سه شنبه 27 اردیبهشت 1390, 11:02 صبح
اگر منظورتون دستورات sql‌ هست ،‌ توي همون mysql وقتي يه جدول يا ديتابيس درست ميكنين يا هر كار ديگه ،‌ خودش دستور sql‌ مورد نظر رو توليد ميكنه و نمايش ميده ،‌ مشكلي نداره !
مثلا براي جدولي كه utf8‌ باشه:

CREATE TABLE `test`.`tblTest` (
`ID` INT( 5 ) NOT NULL ,
`Name` VARCHAR( 10 ) NOT NULL
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_bin;

Mahdi.Spirit
سه شنبه 27 اردیبهشت 1390, 11:13 صبح
ممنون که سوالمو با سوال جواب دادین.
ببینید من یک فرم ورود داده دارم که هر کاربری که داده های مربوط به خودش رو وارد میکنه باید یک جدول ساخته بشه و اطلاعات اون توی اون جدول قرار بگیره و کاربر بعدی در جدول بعدی ...

لطفا در مورد دليل ساخت جدول براي هر كاربر هم يه توضيحي بدين ،‌ مگه چه كار ميخواد بكنه؟:متفکر:

MMSHFE
چهارشنبه 28 اردیبهشت 1390, 07:44 صبح
با سلام، من هم دليل خاصي براي اين كار نميبينم! ميتونيد توي يك جدول اطلاعات همه كاربران رو بگذارين و يك فيلد براي ID كاربر درنظر بگيرين و بعداً هرموقع خواستين اطلاعات مربوط به كاربر خاصي رو استخراج كنيد، با WHERE براش شرط بگذارين يا با GROUP BY اطلاعات رو دسته بندي كنيد.
موفق باشيد.

armintirand
پنج شنبه 29 اردیبهشت 1390, 11:22 صبح
من هنوز فکر میکنم نتونستم کاری که میخوام رو انجام بدم من کد خودم رو مینویسم و میذارم تا در صورت امکان ویرایش کنید.
برای موردی که گفتید فکر کنید که یک اطلاعاتی شامل نام نام خانوادگی ایمیل وبسایت ادرس کد پستی و... را میخواهیم از کاربر بگیریم اسکریپت من باید بتونه برای هر کاربر یک جدول با نام و نام خانوادگی او درست کنه و مشخصاتی که گفتم رو در ستونهای جدول قرار بده حالا اینجا به نظر شما مشکلی تو کار من هست که خیلی گیر دادین(البته برام سواله میخوام بدونم منظورم ناراحت شدن نیست):متعجب:

Mahdi.Spirit
پنج شنبه 29 اردیبهشت 1390, 11:37 صبح
من هنوز فکر میکنم نتونستم کاری که میخوام رو انجام بدم من کد خودم رو مینویسم و میذارم تا در صورت امکان ویرایش کنید.

خب شما كدت رو بزار ،‌ دقيق بگو چيش مشكل داره تا بتونيم دقيق راهنمايي كنيم


برای موردی که گفتید فکر کنید که یک اطلاعاتی شامل نام نام خانوادگی ایمیل وبسایت ادرس کد پستی و... را میخواهیم از کاربر بگیریم اسکریپت من باید بتونه برای هر کاربر یک جدول با نام و نام خانوادگی او درست کنه و مشخصاتی که گفتم رو در ستونهای جدول قرار بده حالا اینجا به نظر شما مشکلی تو کار من هست که خیلی گیر دادین(البته برام سواله میخوام بدونم منظورم ناراحت شدن نیست):متعجب:

آخه معمولا كسي اين كار رو انجام نميده (مگر در سطح مدير سايت اونم يك بار)
اصولا بايد يك بار جدول توسط مدير يا برنامه نويس سايت ساخته بشه شامل اون مواردي كه گفتين (نام و...) ،‌ بعد كاربرها فقط فيلدهاي جدول رو پر ميكنن با اطلاعات خوشون و براي هر كاربر يه id قرار داده ميشه براي شناساييش

eshpilen
جمعه 30 اردیبهشت 1390, 08:24 صبح
ایجاد یک جدول به ازای هر کاربر احتمالا اشتباه است. هم از نظر امنیتی و هم از نظر پرفورمنس.
از نظر امنیتی اگر نام جدول را بر اساس اطلاعات ورودی کاربر تعیین کنید خطر امنیتی زیادی بوجود میاورید. بنابراین از اطلاعات ورودی کاربر در نام جدول استفاده نکنید یا این کار را با دقت و محدودیت و کنترل بسیار دقیقی روی فرمت داده های ورودی کاربر که نام جدول بر اساس آنها انتخاب میشود انجام دهید یا کلا از ایجاد یک جدول به ازای هر کاربر صرفنظر کنید و روش دیگری را بکار بگیرید.




Avoid using dynamic table names if at all possible.
If you have to use dynamic table names, do not accept them from the user if at all possible.


منبع: https://www.owasp.org/index.php/Guide_to_SQL_Injection

از نظر پرفورمنس هم احتمالا سرور دیتابیس برای ایجاد تعداد بسیار زیادی (درحد غیرمنتظره) جدول طراحی نشده. بطور مثال شما میتوانید جدولهایی با تعداد بسیار زیادی (صدها هزار یا حتی میلیونها) رکورد داشته باشید و دیتابیس هنوز با کارایی قابل قبولی کار کند، اما درمورد تعداد زیادی جدول این امر تضمین شده نیست و حداقل ممکن است تعداد جدول های بهینه از تعداد رکوردهای بهینه خیلی کمتر باشد. بخصوص درمورد انجین هایی که به ازای هر جدول یک یا چند فایل ایجاد میکنند (مانند انجین MyISAM که انجین پیشفرض MySQL است) این مسئله به احتمال خیلی بیشتری مسئله ساز خواهد شد و محدودیت بسیار بیشتری خواهد داشت، چون با محدودیت ها و مشکل پرفورمنس سیستم فایل سرور که جدای از سرور دیتابیس است روبرو میشود. یعنی بطور مثال اگر چند ده هزار کاربر داشته باشید احتمالا این مسئله مشکل ساز خواهد شد.

بهرحال موارد ذکر شده درحد دانش و استنباط بنده بود و ممکن است کم و بیش نقص و اشتباهاتی داشته باشند، اما فکر میکنم ایجاد یک جدول به ازای هرکاربر چندان جالب نیست، مگر اینکه تعداد کاربران شما هرگز بیش از حد قابل قبولی زیاد نباشد. و ضمنا استفاده از داده های ورودی کاربر در انتخاب نام جدول هم از نظر امنیتی نیاز به احتیاط بسیار زیادی دارد (استفاده از تابع mysql_real_escape_string در اینمورد کافی نیست) و شاید بهتر باشد از سیستم دیگری برای نامگذاری جدول ها استفاده کنید.
بهرحال اینها مواردی بودند که بنده اطلاع داشتم. این مسئلهء جدیدی است که خود بنده هم درمورد آن تجربه و دانش زیادی ندارم، اما خواستم این موارد را مطرح کنم تا امکان بحث و پیگیری بیشتر روی آن وجود داشته باشد.

armintirand
چهارشنبه 04 خرداد 1390, 13:30 عصر
ببینید کجای این کد من باید دستور

mysql_query('SET NAMES \'utf8\'');
رو یا این رو

INNODB CHARACTER SET utf8 COLLATE utf8_bin;
درون این کد بذارم:
(کد مورد نظر همونیه که تو صفحه اول قراردادن)
فرض کنید میخوام یک رشته فارسی و یک رشته انگلیسی رو هر کدوم رو توی یک ستون وارد کنیم که اولی توی اینه

POST[farsi]
و دومی توی اینه

POST[email]
امیدوارم اینبار جوابمو بگیرم و اگه جواب کامل گرفتم لطفا این تاپیک رو مهم یا چسبناک یا هر اسم دیگه که میگید بکنید تا اول همه تاپیکا بیاد تا هر دوروز یکبار یک تاپیک جدید برای این موضوع باز نکنند.
ممنون

armintirand
پنج شنبه 05 خرداد 1390, 17:18 عصر
اگه کسی بخواد بگه که سوالمو سخته باور نمیکنم ولی از این پیچوندنا مشخصه که دوستان نمیخوان مطلب رو درست به طالب اون برسونن!
شماها به جای اینهمه تیکه تیکه جواب دادن که توی اینترنتم زیاده از این تیکه تیکه ها یکبار یک کد 5 یا 6 خطی میذاشتید و توی اون یک عبارت فارسی رو ذخیره میکردید تا هم بنده ازتون راضی بشه هم خالقش. یه زمون خیلی روی برنامه نویس حساب میکردم ولی دیگه دارم جمع میکنم از اینجا برم.

MMSHFE
پنج شنبه 05 خرداد 1390, 22:47 عصر
با سلام، دوست گرامی، برای ساخت جدول از این کد استفاده کنید:


mysql_connect('localhost','root','');
mysql_select_db('your_db_name');
mysql_query('SET NAMES \'utf8\'');
mysql_query('CREATE TABLE `tblTest` (`ID` INT( 5 ) NOT NULL ,`Farsi` VARCHAR( 10 ) NOT NULL,`English` VARCHAR( 10 ) NOT NULL) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_bin;');

حالا هر جا خواستین اطلاعات رو توی جدول درج کنید، از این کد استفاده کنید:


mysql_connect('localhost','root','');
mysql_select_db('your_db_name');
mysql_query('SET NAMES \'utf8\'');
$result=mysql_query("INSERT INTO `tblTest` VALUES ('{$_POST['id']}','{$_POST['farsi']}','{$_POST['english']}')");

همونطور که میبینید، هربار که به MySQL متصل بشیم و دیتابیس رو انتخاب کنیم، باید از 'SET NAMES 'utf8 استفاده کنیم تا به MySQL اعلام کنیم از کدگذاری یونیکد استفاده میکنیم. بعد از این کار، دیگه مهم نیست داده ای که ثبت میشه فارسی هست یا انگلیسی و به هر شکلی که باشه (با هر زبانی) میتونیم اون رو به شکل استاندارد و درست ذخیره کنیم و نمایش بدیم.
-----
پاورقی : اینقدر زود جوش نیارید !!!
-----
موفق باشید.

armintirand
جمعه 06 خرداد 1390, 10:10 صبح
ممنون دوست عزیز امیدوارم دارم تست میکنم امیدوارم جواب بده.
اگه ممکنه پیام خصوصیتونو چک کنید.

eshpilen
جمعه 06 خرداد 1390, 11:47 صبح
البته اینا رو هم توی صفحات خودتون بذارید:

header('Content-Type: text/html; charset=utf-8');
و

<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
اولی مهمتر از دومی هست. اگر اولی رو بذارید دومی ضروری نیست ولی بهتره اون رو هم بذارید.
حتما میدونید که هدرها رو در ابتدای صفحه و قبل از خروجی های دیگه میذارن، و تگ متا رو هم در قسمت head سند HTML درج میکنن.

armintirand
جمعه 06 خرداد 1390, 21:18 عصر
اره میدونم ممنون از یاد اوریتون ولی یک سوال برای خوندن این اطلاعاتی که ذخیره شده فقط کد:

mysql_query('SET NAMES \'utf8\'');
لازمه؟ یا چیز دیگه ای هم میخواد؟

eshpilen
جمعه 06 خرداد 1390, 22:16 عصر
کافیه دیگه.
چی دیگه میخواد مثلا؟!
تست کردی؟
واسه منکه همیشه کار میکنه و به چیز دیگه ای هم نیاز نبوده.

armintirand
یک شنبه 08 خرداد 1390, 19:42 عصر
یک کلاس هم جدیدا به php اضافه شده mysqli
که فکر میکنم کار باهاش به علت شی گرایی راحتتر از اونی که شما گفتید باشه.

armintirand
شنبه 18 تیر 1390, 15:15 عصر
سلام
آقایان در مورد کارکرد این کلاس mysqli چیزی نمیدومه؟
یک مورد دیگه من برای خوندن از دیتابیس از کد:

<?php
$link = mysql_connect("localhost" , "root" , "123456" );
if(!$link){
die("couldn't connect");
}
mysql_select_db('test',$link)or die("coldent open databases");
$result = mysql_query("SELECT id,Name FROM tblTest ");
if (!$result) {
echo 'Could not run query: ' . mysql_error();
exit;
}
$info = mysql_fetch_array( $result );
print $info['Name'];
?>

استفاده کردم ولی متاسفانه چیزی نمیتونه بخونه به نظرتون مشکل از کجاست؟
باتشکر

armintirand
شنبه 18 تیر 1390, 21:02 عصر
دوستان اکه ممکنه این دومورد رو کمکم کنید دیگه مجبور نشم برم کتاب ۱۰۰۰ صفحه ای بخونم

MMSHFE
یک شنبه 19 تیر 1390, 08:30 صبح
پيغام خطا چيه؟

armintirand
یک شنبه 19 تیر 1390, 11:01 صبح
جالبش اینه که توی مرورگر هیچ خروجی نشون نمیده!
فکر کنم باید توی فایل php.ini کانفیگ خاصی رو فعال کنم!

MMSHFE
یک شنبه 19 تیر 1390, 12:39 عصر
(if(!$result رو به (if(mysql_num_rows($result)<0 تغيير بدين ببينيم مشكل رفع ميشه يا نه.

armintirand
یک شنبه 19 تیر 1390, 13:21 عصر
دریغ از یک حرکت از طرف مرورگر!شرمنده هیچ اتفاقی نیفتاد!

MMSHFE
یک شنبه 19 تیر 1390, 13:37 عصر
اسم تمامي فيلدها و جدولتون و خود ديتابيس رو حروف كوچك كنيد و اين كد رو امتحان كنيد:


<?php
mysql_connect('localhost', 'root', '123456') or die('Couldn\'n connect.');
mysql_select_db('test') or die('Colden\'t open database.');
$result = mysql_query('SELECT * FROM `tbltest` ORDER BY `id`');
if (mysql_num_rows($result) > 0)
{
while($info = mysql_fetch_assoc($result))
{
echo '<pre>'."\n";
print_r($info);
echo '</pre>'."\n";
}
}
else
{
echo 'Could not run query: '.mysql_error();
exit();
}
?>

armintirand
یک شنبه 19 تیر 1390, 15:43 عصر
ممنون بابت کدتون ولی کار نکرد!
باز هم مرورگر از خودش هیچ ارور و نتیجه ای نداد

MMSHFE
دوشنبه 20 تیر 1390, 07:53 صبح
ميشه يك نسخه از ديتابيس خروجي بگيرين و برام بفرستين تا تست كنم؟ راستي، كلاً چك كنيد ببينيد اكستنشنهاي php_mysql و php_mysqli فعال هستن يا نه؟

armintirand
دوشنبه 20 تیر 1390, 13:18 عصر
برای گرفتن خروجی از دیتابیسم چه کدی باید بنویسم؟
بلی این اکستنشنها فعالند چون کدی که برای ذخیره داده توی دیتابیس برام داده بودید کار میکنه.