PDA

View Full Version : سوال: اصلاح کد آپدیت دیتابس



wordnet
شنبه 29 بهمن 1390, 13:29 عصر
سلام

دوستان من میخوام یه رکورد از جدول دیتابسم اپدیت کنم کد هام به این صورت

کد صفحه فرم:


<?php session_start();
if(!isset($_SESSION['user']) || !isset($_SESSION['pass']))
header('Location:login.php'); ?>
<!doctype html>
<head>
<title>Database DEMO</title>
<meta charset="utf-8"/>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<?php
require "class/config.php";
$sql = mysql_query('SELECT * FROM `user` ORDER BY `id`');
if($sql && mysql_num_rows($sql) > 0) {
echo '<table border="1px">'.PHP_EOL;
while($item = mysql_fetch_assoc($sql)) {
echo '<tr>'.PHP_EOL;
echo '<td>'.$item['id'].'</td>'.PHP_EOL;
echo '<td>'.$item['na'].'</td>'.PHP_EOL;
echo '<td>'.$item['user'].'</td>'.PHP_EOL;
echo '<td>'.$item['mail'].'</td>'.PHP_EOL;
echo '<td>'.$item['pass'].'</td>'.PHP_EOL;
echo '</tr>'.PHP_EOL;
}
mysql_free_result($sql);
echo '</table>'.PHP_EOL;
}
else {
echo '<p>Data not found.</p>'.PHP_EOL;
echo '<p>'.mysql_error().'</p>'.PHP_EOL;
}
?>
<p><a href="Logout.php"> خروج</a></p>
<br>
<form action="member1.php" method="post">
<a id="test">نام کاربر <input name="username" size="20" type="text">
</a>
<br>
<a id="test">نام کاربر منتخب<input name="usernew" size="20" type="text">
</a>
<input type="submit" value="ثبت" name="submit"></form>
</body>
</html>


کد صفحه پردازش دستور اپدیت


<?php
if (isset($_POST['username']) && isset($_POST['usernew'])) {
require_once 'class/config.php';
$username=$_POST["username"];
$usernew=$_POST["usernew"];
$guery = mysql_query ("UPDATE user SET user=$usernew WHERE user=$username");
die(mysql_affected_rows() > 0 ? 'شما با موفقیت در سیستم دفترچه تلفن عضو شدید' : 'متاسفانه عملیات ناموفق بود');
}

?>


لطفا راهنمایی کنید
ممنون

lady64
شنبه 29 بهمن 1390, 13:52 عصر
اول ببینید که username رو در پایگاه بصورت uniqe تعریف کردید یا خیر؟این مهمه که باید uniq باشه.
اگه اینطور تعریف شده بنظرم کدتون درسته.
البته بهتره کدی هم برای جلوگیری از ورود username جدید بزارید.

wordnet
شنبه 29 بهمن 1390, 15:32 عصر
uniq چیه؟توضیح بدید نشدیم

masoud_tamizy
شنبه 29 بهمن 1390, 16:00 عصر
unique یعنی یکتا = یعنی اینکه تو کل سطرهای جدول در ایم فیلد مقادیر مشابه نداشته باشی . مثلا فیلدی رو که کلید اولیه تعریف کنی یونیک هم هست .

wordnet
شنبه 29 بهمن 1390, 16:03 عصر
الان توی بانک من فقط مقادیر مثل هم شماره id کاربره که همه رو 0 میزنه اونو چطور باید ترتیب بندی کنم؟

lady64
شنبه 29 بهمن 1390, 17:30 عصر
سوالتون یه مقدار واضح نیست.اما username شما یا باید کلید اصلی باشه یا اگر کلید اصلی تعریف نکردید بصورت uniq تعریف کنید.چون نباید مقدار username برای افراد مختلف یکسان باشه.
فیلدهای جدول user تون رو چطور تعریف کردید؟ نام و نوع اونها رو بگید تا روی اون جواب بدیم.

wordnet
شنبه 29 بهمن 1390, 19:11 عصر
سلام

کل دیتابس من اینه
http://upimage.ir/images/9zjw5pow1yrxmg33hok.gif
این uniq کجا باید تعیین کرد لطفا راهنمایی کنید

lady64
شنبه 29 بهمن 1390, 20:51 عصر
مرسی.روبروی user رو ببینید یک گزینه ی u داره که اگه روش کلیک کنید user شما uniq میشه.id هم که حتما کلید اصلی تعریف کردید.در ضمن من خودم برای user ، گزینه utf8_unicode_ci رو انتخاب میکنم.حالا نظر دوستان رو هم بپرسید.البته خیلی مسائل دیگه مثل رمز شدن pass رو هم باید در نظر بگیرید که در پایگاهتون قابل مشاهده و حدس نباشه.
با این اوصاف update ، با فرض اینکه کدهای دیگتون درسته باید کار کنه.
در ضمن فیلد na برای چیه ؟

wordnet
یک شنبه 30 بهمن 1390, 20:32 عصر
مرسی.روبروی user رو ببینید یک گزینه ی u داره که اگه روش کلیک کنید user شما uniq میشه.id هم که حتما کلید اصلی تعریف کردید.در ضمن من خودم برای user ، گزینه utf8_unicode_ci رو انتخاب میکنم.حالا نظر دوستان رو هم بپرسید.البته خیلی مسائل دیگه مثل رمز شدن pass رو هم باید در نظر بگیرید که در پایگاهتون قابل مشاهده و حدس نباشه.
با این اوصاف update ، با فرض اینکه کدهای دیگتون درسته باید کار کنه.
در ضمن فیلد na برای چیه ؟
فیلد na برای نام و نام خانوادگیه

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

wordnet
سه شنبه 02 اسفند 1390, 21:29 عصر
دوستان کدای من ارور
متاسفانه عملیات ناموفق بود
میده اون مورد uniq رعایت شد

MMSHFE
سه شنبه 02 اسفند 1390, 22:00 عصر
ببینید این کد کار میکنه؟


if (isset($_POST['username'], $_POST['usernew'])) {
require_once 'class/config.php';
mysql_connect('localhost', 'root', '') or die('Connection error');
mysql_select_db('dbname') or die('Database error');
mysql_query('SET NAMES \'utf8\'');
$username = mysql_real_escape_string(strtolower($_POST['username']));
$usernew = mysql_real_escape_string(strtolower($_POST['usernew']));
$query = mysql_query("UPDATE `user` SET `user`='{$usernew}' WHERE (`user`=LOWER('{$username}'))");
echo mysql_affected_rows() > 0 ? 'شما با موفقیت در سیستم دفترچه تلفن عضو شدید' : 'متاسفانه عملیات ناموفق بود';
}

موفق باشید.

wordnet
سه شنبه 02 اسفند 1390, 22:11 عصر
نه متاسفانه دوباره گفت
متاسفانه عملیات ناموفق بود
کلی خودم هم قبلا تلاش کردم.خواهشا کمک کنید

MMSHFE
سه شنبه 02 اسفند 1390, 22:20 عصر
خط 9 رو اینطوری تغییر بدین ببینید چی چاپ میشه؟

echo mysql_affected_rows() > 0 ? 'شما با موفقیت در سیستم دفترچه تلفن عضو شدید' : mysql_error();
موفق باشید.

wordnet
سه شنبه 02 اسفند 1390, 22:25 عصر
اقا حل شد

دمت گرم همون کد اولی که گفتی یعنی این



<?php
if (isset($_POST['username'], $_POST['usernew'])) {
require_once 'class/config.php';
mysql_connect('localhost', 'root', '') or die('Connection error');
mysql_select_db('testphp') or die('Database error');
mysql_query('SET NAMES \'utf8\'');
$username = mysql_real_escape_string(strtolower($_POST['username']));
$usernew = mysql_real_escape_string(strtolower($_POST['usernew']));
$query = mysql_query("UPDATE `user` SET `user`='{$usernew}' WHERE (`user`=LOWER('{$username}'))");
echo mysql_affected_rows() > 0 ? 'شما با موفقیت در سیستم دفترچه تلفن عضو شدید' : 'متاسفانه عملیات ناموفق بود';
}
?>


علت اینکه اول درست نبود اینه که شما در خط 3 دیتابس منو از فایل کانفینگ خوندید بعد زیرش اطلاعات دیتابس دادید من دیگه خط 2 رو خوندم بعدشو دقت نکردم و باید دیتابسمو وارد میکردم الان سوالم اینه باید برای این عمل هم کد خط 2 باشه هم خط 4 و 5 یا یکیش کافیه؟


بسیار ممنون اقا محمد مثل همیشه مشکل مارو حل کردی واقعا ممنون

MMSHFE
سه شنبه 02 اسفند 1390, 22:29 عصر
یکیش کافیه. من فکر کردم اتصال به دیتابیس رو قبلش انجام ندادین و برای اطمینان قبلش نوشتم ولی گویا خودتون توی فایل config اینکار رو انجام دادین. دقت کنید که برای اجرای mysql_real_escape_string وجود یک کانکشن به MySQL لازمه. برای همین من دستورات اتصال رو نوشتم. موفق باشید.

wordnet
سه شنبه 02 اسفند 1390, 22:33 عصر
اقا شرمنده بازم سوال دارم

خیلی برام مهم شد
این خط 7 و 8 چرا این شکلیه مگه برای ریختن یه ورودی از فرم نمیشه مثل همیشه اینطور نوشت


$username=$_POST["username"];


اخه من میخوام کوئری حذف رکورد دیتابسم بسازم اونم مثل شما انجام بدم؟
اخه این یه تیکه رو کلا هیجا ندیدم در حد مبتدی من نیست جسارتا با عرض پوزش فراوان راهنمایی بفرمائید.شرمنده

MMSHFE
سه شنبه 02 اسفند 1390, 22:36 عصر
ببینید دوست عزیز، از تابع mysql_real_escape_string برای جلوگیری از حملات SQL Injection استفاده میشه. از تابع strtolower هم برای این استفاده کردم که اگه نام کاربری رو با حروف بزرگ وارد کردیم، اول به حروف کوچک تبدیل بشه و بعد، با معادل حروف کوچک نام کاربری موجود در دیتابیس مقایسه بشه (با کمک تابع LOWER در MySQL). اینطوری دیگه نام کاربری به بزرگی و کوچکی حروف حساس نخواهد بود. موفق باشید.

wordnet
چهارشنبه 03 اسفند 1390, 12:55 عصر
سلام

برای اپدیت فیلد هایی که به صورت فارسی هم ذخیره شد باید مثل کد زیر عمل کرد؟چون من اینو انجام دادم ارور داد



<?php

if (isset($_POST['name1'] , $_POST['name2']))
{
require_once 'class/config.php';
$name1= mysql_real_escape_string (strtolower($_POST['name1']));
$name2= mysql_real_escape_string (strtolower($_POST['name2']));
mysql_query ("UPDATE `user` SET `na`='{$name2}' WHERE (`na`=LOWER('{$name1}'))");
echo mysql_affected_rows()> 0 ? 'عملیات موفقیت امیز بود' : 'ناموفق بود';

}

?>

MMSHFE
چهارشنبه 03 اسفند 1390, 13:11 عصر
نه برای فارسی باید از توابعی که در رشته های MultiByte کاربرد دارن استفاده کنید. استفاده فکر میکنم کوئری شما یک اشکال در طراحی داشته باشه. میشه بگین name1 و name2 و na چی هستن و میخواین چه کاری انجام بدین؟

wordnet
چهارشنبه 03 اسفند 1390, 13:18 عصر
سلام

name 1 نام فارسی فعلی کاربره
name 2 نامی که قراره بهش تغییر کنه
na اسم فیلد توی mysql در دیتابس user

محتویان فایل ارسال دستورات تغییر هم



<?php session_start();
if(!isset($_SESSION['user']) || !isset($_SESSION['pass']))
header('Location:login.php'); ?>
<!doctype html>
<head>
<title>Database DEMO</title>
<meta charset="utf-8"/>
<link href="style.css" rel="stylesheet" type="text/css">
<link href="class/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<?php
require "class/config.php";
$sql = mysql_query('SELECT * FROM `user` ORDER BY `id`');
if($sql && mysql_num_rows($sql) > 0) {
echo '<table border="1px">'.PHP_EOL;
while($item = mysql_fetch_assoc($sql)) {
echo '<tr>'.PHP_EOL;
echo '<td>'.$item['id'].'</td>'.PHP_EOL;
echo '<td>'.$item['na'].'</td>'.PHP_EOL;
echo '<td>'.$item['user'].'</td>'.PHP_EOL;
echo '<td>'.$item['mail'].'</td>'.PHP_EOL;
echo '<td>'.$item['pass'].'</td>'.PHP_EOL;
echo '</tr>'.PHP_EOL;
}
mysql_free_result($sql);
echo '</table>'.PHP_EOL;
}
else {
echo '<p>Data not found.</p>'.PHP_EOL;
echo '<p>'.mysql_error().'</p>'.PHP_EOL;
}
?>
<p><a href="Logout.php"> خروج</a></p>

<form action="member1.php" method="post">
<a id="test">نام کاربر <input name="username" size="20" type="text">
</a>
<br>
<a id="test">نام کاربر ی جدید<input name="usernew" size="20" type="text">
</a>
<br>
<input type="submit" value="ثبت" name="submit"></form>
<form action="member2.php" method="post">
<a id="text">نام کاربر جهت حذف<input name="hazf" size="20" type="text">
<br>
<input name="submit" value="ثبت" type="submit">
</a>
<br>
</form>
<form action="changename.php" method="post">
<a id="text">نام خانوادگی قبلی<input name="name1" type="text" size="20">
<br>
<a id="text">نام خانوادگی جدید<input name="name2" type="text" size="20">
<br>
<input type="submit" name="submit" value="تغییر بده">
</a>
</form>
</body>
</html>


*توی این کد فوق چندتا فروم هست اخریش مربوط به این تغییر نام فارسیه

MMSHFE
چهارشنبه 03 اسفند 1390, 15:40 عصر
اصول طراحی میگه که توی یک صفحه نباید بیش از یک فرم داشته باشین. ممکنه مشکل بخاطر این موضوع باشه. یکبار فرمهای دیگه رو حذف کنید ببینید مشکل رفع میشه یا نه؟

wordnet
چهارشنبه 03 اسفند 1390, 16:23 عصر
انجام دادم نشد اینم بگم اون دو تا فرم دیگه کاملا کار میکنه

خواهشا راهنمایی کنید طریقه اپدیت در زبان فارسی فرق نداره؟

MMSHFE
چهارشنبه 03 اسفند 1390, 17:05 عصر
توی فایل config بعد از اتصال، SET NAMES utf8 رو اجرا میکنید؟ اگه اینطوره، بهتره کدتون رو اینطوری تغییر بدین (فقط برای عبارتهای فارسی) :


if (isset($_POST['name1'] , $_POST['name2'])) {
require_once 'class/config.php';
mysql_set_charset('utf8');
$name1= mysql_real_escape_string(strtolower($_POST['name1']));
$name2= mysql_real_escape_string(strtolower($_POST['name2']));
mysql_query ("UPDATE `user` SET `na`='{$name2}' WHERE (LOWER(`na`)='{$name1}')");
echo mysql_affected_rows()> 0 ? 'عملیات موفقیت آمیز بود' : 'ناموفق بود';
}

علت این مسئله اینه که تابع mysql_set_charset باعث میشه charset مورد استفاده در دستور mysql_real_escape_string هم تغییر کنه ولی SET NAMES به تنهایی این کار رو انجام نمیده.
موفق باشید.

wordnet
چهارشنبه 03 اسفند 1390, 17:48 عصر
بازم نشد
همچنین تمام تنظیمات فارسی بودن اطلاعات دیتابس درسته چرا که در عضویت اطلاعات فارسی داده میشه و کاملا صحیحه

wordnet
پنج شنبه 04 اسفند 1390, 10:55 صبح
??????????????

MMSHFE
پنج شنبه 04 اسفند 1390, 11:05 صبح
میشه کد کامل رو بگذارین؟ من تست کردم کاملاً کار میکرد.

wordnet
پنج شنبه 04 اسفند 1390, 11:11 صبح
سلام

اقا دمت گرم جواب میدی

کل سیستمو ضمیمه کردم فقط

از فایل لوگین میتونید وارد بشید دیتابس هم توی فایل ضمیمه هست اینم یک یوزر
modir
1234

دستت دردنکنه

ممنون

MMSHFE
پنج شنبه 04 اسفند 1390, 12:01 عصر
کاری که من انجام دادم:
1- لاگین با نام کاربری modir و رمز عبور 1234
2- تایپ نام خانوادگی قبلی «مدیریت»
3- تایپ نام خانوادگی جدید «مدیر»
4- کلیک روی دکمه «تغییر بده»
خروجی:
http://up5.iranblog.com/images/75975211298708738564.jpg
موفق باشید.

wordnet
پنج شنبه 04 اسفند 1390, 12:12 عصر
عجب!
پس چرا من میزنم میگه ناموفق بود ؟ممکنه اشکال از phpmyadmin باشه؟چونکه بقیه مورد ها که دید همه کار میکنه جز این یکی گیج شدم!

MMSHFE
پنج شنبه 04 اسفند 1390, 14:31 عصر
شاید بخاطر حرف ی باشه که عربی و فارسی اون با هم متفاوته. یکبار همون کلمه ای که توی phpmyadmin هست رو کپی کنید و توی کادر Paste کنید و کلمه جدید رو بگذارین ببینیم مشکل رفع میشه یا نه؟

wordnet
پنج شنبه 04 اسفند 1390, 16:43 عصر
اقا بازم نشد! میگه ناموفق من حتی با نامی که توی ی هم نباشه انجام دادم مثلا احمد

MMSHFE
پنج شنبه 04 اسفند 1390, 17:26 عصر
جالبه. من دقیقاً همون کد شما رو بدون کوچکترین تغییری اجرا کردم. مرورگرتون چیه؟ من با فایرفاکس امتحان کردم.

wordnet
پنج شنبه 04 اسفند 1390, 17:39 عصر
فایر فاکس اخرین اپدیت

MMSHFE
پنج شنبه 04 اسفند 1390, 17:42 عصر
تعجب میکنم. برای اطمینان دوباره کد رو امتحان کردم ولی باز هم کار کرد. از سایر دوستان هم میخوام که درصورت امکان تست کنن ببینن کد درست کار میکنه یا نه؟ میگم من Collation دیتابیس رو utf8_bin گذاشتم. شاید بخاطر این باشه.