PDA

View Full Version : سوال: خواندن مقادیر از پایگاه با جاوا (حل شد)



lady64
شنبه 19 فروردین 1391, 12:26 عصر
یک جدول دارم شامل محصولات و قیمت آنها.میخوام وقتی کاربر محصول رو از لیست باکس انتخاب میکنه قیمت رو بدون کلیک بر دکمه و عدم رفرش بهش نشون بده. تا جایی که میدونم این هم با جاوا میشه هم ajax.در تالارهای دیگه جواب نگرفتم .ممنون میشم نمونه کد مربوط به جاوا رو بزارید.

lady64
یک شنبه 20 فروردین 1391, 07:47 صبح
بنظرم خیلی هاتون جواب این سوال رو بلدید.من خوندن از بانک اطلاعاتی توسط جاوا رو میخوام بدونم.آخه تو مثال من بهتره بجای php از جاوا استفاده بشه.ممنون میشم رو مثال خودم توضیح بدید.
یا لا اقل یه منبع خوب برای یادگیری جاوا معرفی کنید.مرسی

MMSHFE
یک شنبه 20 فروردین 1391, 08:12 صبح
با سلام، دوست عزیز اگه منظورتون از جاوا، JSP هست که ارتباطی به این تالار نداره ولی اگه منظورتون Javascript هست هم باید بدونید که با همون AJAX کار میشه چون اصلاً JS که سمت کلاینت هست به دیتابیس که سمت سروره بخاطر مسائل امنیتی و... دسترسی نداره. بجای این کار شما میتونید یک فایل PHP داشته باشین که اطلاعات رو استخراج میکنه و اون رو با AJAX صدا بزنید. در کل نمیدونم چرا میگین بهتره بجای PHP از جاوا استفاده بشه ولی اگه همین روشی که گفتم به کارتون میاد، بفرمایید تا براتون مثال بگذارم.
موفق باشید.

lady64
یک شنبه 20 فروردین 1391, 13:29 عصر
ممنون از توضیحاتتون.بله روش کار با ajax رو لطفا بفرمائید.

MMSHFE
یک شنبه 20 فروردین 1391, 14:15 عصر
این کد صفحه PHP هست که قیمت رو از دیتابیس استخراج میکنه و فرض میکنیم با نام price.php ذخیره شده:


<?php
if(!isset($_GET['id']) || !is_numeric($_GET['id'])) {
die('Invalid ID');
}
$id = (int) $_GET['id'];
mysql_connect('localhost', 'root', '') or die('Connection error');
mysql_select_db('dbname') or die('Database error');
$product = mysql_query("SELECT * FROM `products` WHERE (`id`='{$id}') ORDER BY `id` LIMIT 1");
if($product && mysql_num_rows($product) == 1) {
$product = mysql_fetch_assoc($product);
echo $product['price'];
}
else {
echo 'Invalid ID';
}
?>

این هم صفحه ای که محصولات رو نشون میده و باید با انتخاب هر محصول، قیمتش رو ببینیم:


<!doctype html>
<html>
<head>
<title>AJAX Price DEMO</title>
<meta charset="utf-8"/>
<script src="jqmin.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#pid").change(function() {
if($(this).val() == 0) {
$("#price").html("&nbsp;");
}
else {
$.ajax({
type: "get",
url: "price.php",
data: "id="+$(this).val(),
success: function(data) {
$("#price").html(data);
}
});
}
});
});
</script>
</head>
<body>
<select id="pid">
<option value="0">&nbsp;</option>
<?php
mysql_connect('localhost', 'root', '') or die('Connection error');
mysql_select_db('dbname') or die('Database error');
mysql_query('SET NAMES \'utf8\'');
$products = mysql_query('SELECT * FROM `products` ORDER BY `id`');
if($products && mysql_num_rows($products) > 0) {
while($product = mysql_fetch_assoc($products)) {
?>
<option value="<?php echo $product['id']; ?>"><?php echo $product['name']; ?></option>
<?php
}
}
?>
</select>
<p>Price:
<div id="price">&nbsp;</div>
</p>
</body>
</html>

البته کد فوق با jQuery کار میکنه و لذا باید فایل فشرده jQuery رو از سایت www.jquery.com دریافت کنید و در کنار اسکریپتتون با نام jqmin.js ذخیره کنید.
-----
توضیح:
فایل price.php که مشخصه چطور کار میکنه: یک ID با روش GET میگیره و دنبالش توی دیتابیس و جدول محصولات میگرده و قیمتش رو برمیگردونه.
اما فایل نمایش محصولات، ابتدا همه محصولات رو با کمک PHP از دیتابیس استخراج کرده و اونها رو توی یک لیست باکس میگذاره و اون رو طوری تنظیم میکنه که با انتخاب هر کالا، id اون بعنوان مقدار درنظر گرفته بشه. موقع تغییر مقدار این لیست باکس، jQuery وارد عمل میشه و اول چک میکنه ببینه آیا مقدار انتخاب شده، صفر هست یا نه و اگه صفر بود، تگ div مربوط به قیمت کالا رو خالی میکنه. اما اگه صفر نباشه، اونوقت با تابع ajax در jQuery فایل price.php رو با روش GET صدا میزنه و مقدار انتخاب شده در لیست باکس رو تحت عنوان پارامتر id براش میفرسته. وقتی هم که درخواست ارسال شد و جواب اومد، جواب دریافت شده رو توی کادر قیمت نشون میده.
اگه سؤالی بود در خدمتم. موفق باشید.

lady64
دوشنبه 15 خرداد 1391, 09:23 صبح
سلام. ممنون این مورد درست شد . فقط یه مسئله ی دیگه . من با while ، پنج تا لیست باکس درست کردم و اسم اونها در هر اجرا با یک متغیر عوض میشه ولی آیدی لیست باکس ثابته . ولی با اینحال فقط برای لیست باکس اولی جواب میده . من میخوام از هر لیست باکس که انتخاب میکنم نتیجه رو نشون بده . مگه جاوا با آیدی کار نمیکنه ؟ باید آیدی رو هم در هر بار اجرای حلقه ی while‌ تغییر بدم ؟


<?php $s=1;while($s < 6)
{ $service_name=new Service_Name();
$result1=$service_name->SelectAll();
$is=mysql_num_rows($result1);
?>
<select name="<?php echo 'sservice'."$s" ?>" id="sservice1">
<option value="">انتخاب خدمات</option>
<?php
if($is==0)
echo '<p>عبارت مورد جستجو یافت نشد.</p>';
else
{
$i=1;
while($rows=mysql_fetch_array($result1)){
?>
<option value="<?php echo $rows['ID_SN']?>"><?php echo $rows['S_Name']; ?></option>
<?php
}
}?>
</select>
<div class="td-service"><div id="price"> </div>
</div>


اگر آیدی هم باید مثل نام تغییر کنه میشه لطف کنید بگید چه تغییراتی باید انجام بشه ؟

MMSHFE
دوشنبه 15 خرداد 1391, 15:07 عصر
id رو هم مثل همون روشی که name رو تغییر میدین، تغییر بدین. id باید منحصر به فرد باشه وگرنه کار نمیکنه.

lady64
سه شنبه 16 خرداد 1391, 09:38 صبح
درسته . ولی من این قسمت رو نمیدونم چطور تغییر بدم . چون اسم آیدی از یک نام ثابت به اضافه ی یک متغیر تشکیل شده این قسمت رو در کدی که شما گذاشتید چطور تغییر بدم ؟


$("#pid").change(function() {


در حقیقت فرض کنیم pid یک ثابت و $s یک متغیر هست که با هم الحاق میشن.

MMSHFE
سه شنبه 16 خرداد 1391, 09:50 صبح
$("select[id^=pid]").change(function() {
مثال فوق، رویداد change همه تگهای select که id اونها با pid شروع میشه رو کنترل میکنه.

lady64
سه شنبه 16 خرداد 1391, 15:53 عصر
ممنون . فقط یک مشکل دیگه . من با while پنج تا listbox درست کردم و میخوام با انتخاب هر listbox قیمت رو جلوش درج کنه . نام div مربوطه رو هم که قیمت اونجا درج میشه مثل select متغیر دادم . اما وقتی یکی از listbox ها رو انتخاب میکنم ، قیمت در 5 تا ردیف درج میشه . نمیدونم چطور بگم اگر ا listbox2 مثلا انتخاب شد در div2 درج کن . این کد من .



<script type="text/javascript" src="../jquery-file/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("select[id^=sservice]").change(function() {
if($(this).val() == 0) {
$("div[id^=price").html("&nbsp;");
}
else {
$.ajax({
type: "get",
url: "../form/Price.php",
data: "id="+$(this).val(),
success: function(data) {
$("div[id^=price]").html(data);
}
});
}
});
});
</script>




<form id="form2" name="form2" method="post" action="">
<div class="top-service"><label class="label2">ثبت تعمیرات</label></div><!-- end top -->

<div class="tr-service">
<div class="td-service2">
<span class="error">*</span>خدمات</div>
<div class="td-service">
<span class="error">*</span>اجرت واحد</div>

<div class="td-service">
<span class="error">*</span>تخفیف</div>
<div class="td-service">
<span class="error">*</span>جمع</div>
</div>
<?php $s=1;while($s < 6)
{ $service=new Service();
$result1=$service->SelectAll();
$is=mysql_num_rows($result1);
?>
<div class="tr-service" >

<div class="td-service2" >

<select name="<?php echo 'sservice'."$s" ?>" id="<?php echo 'sservice'."$s" ?>">
<option value="">انتخاب خدمات</option>
<?php
if($is==0)
echo '<p>عبارت مورد جستجو یافت نشد.</p>';
else
{
$i=1;
while($rows=mysql_fetch_array($result1)){
?>
<option value="<?php echo $rows['ID']; ?>"><?php echo $rows['Name']; ?></option>
<?php
}
}?>
</select>

</div>

<div class="td-service">

<div id="<?php echo 'price'."$s" ; ?>">&nbsp;</div>

</div>
<div class="td-service">
</div>
<div class="td-service">
</div>

</div>

<?php $s++; } ?>
<div class="tr-service">
<input name="service" type="submit" id="service" value=" ثبت خدمات " onclick="return check()" />
</td>
</div>

</form>


اصلا اگه خودتون یک مثال کامل در این زمینه دارید که با انتخاب قیمت و تعداد جمع هم بدون submit‌ زده بشه ممنون میشم بزارید . میدونم باید مطالعات جاوااسکریپت و ajax رو داشته باشم ، ولی بدلیل محدودیت وقت اینقدر میپرسم.

MMSHFE
سه شنبه 16 خرداد 1391, 16:06 عصر
اینو امتحان کنید (توی تابع success) :
$(this).parent().next().html(data);

lady64
سه شنبه 16 خرداد 1391, 18:17 عصر
ممنون.من به جای خط 14 از کد جاوا اسکریپت اینو گذاشتم ولی نتیجه نداد.

lady64
چهارشنبه 17 خرداد 1391, 16:21 عصر
آقای شهرکی نتیجه نداد . چه تغییر دیگه ای لازمه ؟

MMSHFE
پنج شنبه 18 خرداد 1391, 15:37 عصر
این چطور؟
$(this).parent().next().children("div[id^=price]").html($(this).val());
این مثال رو ببینید:


<!doctype html>
<html>
<head>
<title>TEST</title>
<meta charset="utf-8"/>
<script src="jqmin.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
$("select[id^=sservice]").change(function() {
$(this).parent().next().children("div[id^=price]").html($(this).val());
});
});
</script>
</head>
<body>
<div class="tr-service">
<div class="td-service2">
<select id="sservice1" name="sservice1">
<option value="op1">Option 1</option>
<option value="op2">Option 2</option>
<option value="op3">Option 3</option>
</select>
</div>
<div class="td-service">
<div id="price1">&nbsp;</div>
<div>
</div>
<div class="tr-service">
<div class="td-service2">
<select id="sservice1" name="sservice1">
<option value="op1">Option 1</option>
<option value="op2">Option 2</option>
<option value="op3">Option 3</option>
</select>
</div>
<div class="td-service">
<div id="price1">&nbsp;</div>
<div>
</div>
<div class="tr-service">
<div class="td-service2">
<select id="sservice1" name="sservice1">
<option value="op1">Option 1</option>
<option value="op2">Option 2</option>
<option value="op3">Option 3</option>
</select>
</div>
<div class="td-service">
<div id="price1">&nbsp;</div>
<div>
</div>
<div class="tr-service">
<div class="td-service2">
<select id="sservice1" name="sservice1">
<option value="op1">Option 1</option>
<option value="op2">Option 2</option>
<option value="op3">Option 3</option>
</select>
</div>
<div class="td-service">
<div id="price1">&nbsp;</div>
<div>
</div>
<div class="tr-service">
<div class="td-service2">
<select id="sservice1" name="sservice1">
<option value="op1">Option 1</option>
<option value="op2">Option 2</option>
<option value="op3">Option 3</option>
</select>
</div>
<div class="td-service">
<div id="price1">&nbsp;</div>
<div>
</div>
</body>
</html>

موفق باشید.

lady64
جمعه 19 خرداد 1391, 15:04 عصر
طلسم شده:عصبانی++: ، هر نوع تغییری بود اعمال کردم ولی هیچ اتفاقی نمی افته . حتی مثل مثال شما از while هم خارج کردم . . هر کاری میکنم نتیجه این میشه که با انتخاب یکی از listbox ها همه ی خونه های دیگه اون مقدار رو نشون میدن .

MMSHFE
جمعه 19 خرداد 1391, 15:10 عصر
اگه میشه کد کامل رو همراه با یک Export از دیتابیس ضمیمه کنید تا روی کد خودتون اصلاحات رو اعمال کنم. اینقدر زود عصبانی نشین. کدهای خوب در حالت خونسردی نوشته میشن.
موفق باشید.

lady64
شنبه 20 خرداد 1391, 15:47 عصر
درسته ! حق با شماست . از اون مشتری عصبانی هستم که نگاهشون windows application ای هست ولی همه چیز رو تحت وب میخوان . اصلا اگر هم به نتیجه برسم اینو براشون پیاده نمیکنم یه کم سختی بکشن.:چشمک:
ممنون . این بخشی از کد و دیتابیس من هست .
در ضمن اون کد رو فعال کردم ولی سایت شما باز نمیشه .

MMSHFE
شنبه 20 خرداد 1391, 15:59 عصر
بفرمایید، درست شد. این کد رو جایگزین اسکریپت JS خودتون کنید:


<script type="text/javascript">
$(document).ready(function() {
$("select[id^=sservice]").change(function() {
var target = $(this).parent().next().children("div[id^=price]");
if($(this).val() == 0) {
target.html("&nbsp;");
}
else {
$.ajax({
type: "get",
url: "price.php",
data: "id="+$(this).val(),
success: function(data) {
target.html(data);
}
});
}
});
});
</script>
موفق باشید.

lady64
شنبه 20 خرداد 1391, 17:35 عصر
خیلی ممنونم . در فایل مستقلی که فرستادم کاملا درست شد. فقط در برنامه ی اصلیم فایل service.php درون یک صفحه ی دیگه requie شده و فکر کنم به خاطر همین جواب نمیده . نمیخوام بیشتر از این وقت شما رو بگیرم ، تا این جا هم که همراهی کردید بسیار ممنونم . فقط ممنون میشم یک توضیح در مورد این دو کد بدید :


target.html(data);

target = $(this).parent().next().children("div[id^=price]");

در ضمن بهترین منبع برای شروع یادگیری ajax هم لطفا معرفی کنید .

MMSHFE
شنبه 20 خرداد 1391, 18:40 عصر
شرمنده یه جای کد اشتباه بود که درستش کردم. دوباره تست کنید. دستور دوم که نوشتین (و در اصل باید اول باشه)، شئ div خاصی که id اون با کلمه price شروع میشه و در همسایگی والد شئ جاری (تگ select) هست پیدا میکنه و توی متغیر target میگذاره و دستور دوم توسط تابع html محتوای داخل اون شئ رو با نتیجه اجرای AJAX پر میکنه.

lady64
یک شنبه 21 خرداد 1391, 10:11 صبح
خیلی خیلی ممنونم. درست شد . واقعا زحمت کشیدید.
فقط یک سوال دیگه (ببخشیداااااااااااااااااا ااا)
یادم رفته بود که بالاخره قراره این هزینه رو ذخیره کنم در پایگاه . بخاطر همین بجای div یک input گذاشتم ، فقط نمیدونم مقدار value رو چی بزارم . 2 تغییر لازم بود :
یکی این :


var target = $(this).parent().next().children("input[id^=price]");


یکی هم این به جای div :


<div class="td-service">

<input name="<?php echo 'price'."$s" ; ?>" type="text" id="<?php echo 'price'."$s" ; ?>" size="12" />

</div>

فقط مقدار value چی باید باشه که هم نشون بده و هم بتونم با post دریافت کنم ؟
پیشاپیش ممنون .نمیدونم چطور باید تشکر کنم !!

MMSHFE
یک شنبه 21 خرداد 1391, 10:18 صبح
value باید خالی باشه. فقط کافیه توی کد JS بجای تابع html از تابع val استفاده کنید.
target.val(data);

lady64
یک شنبه 21 خرداد 1391, 10:36 صبح
مرسی. دوتا target داریم . target دومی رو تغییر دادم ولی مقداری که در textfield نشون میده بدین صورته :


<!DOCTYPE html >
12000
</body>
</html>

عدد رو مینویسه ولی قبل و بعدش کد html داره.البته به دلیل کوچک بودن سایز textfield فکر کنم کلی کد دیگه هست که دیده نمیشه.

MMSHFE
یک شنبه 21 خرداد 1391, 10:44 صبح
هر دو taget رو باید اصلاح کنید. کلاً کد JS شما باید اینطوری باشه:


<script type="text/javascript">
$(document).ready(function() {
$("select[id^=sservice]").change(function() {
var target = $(this).parent().next().children("input[id^=price]");
if($(this).val() == 0) {
target.val("&nbsp;");
}
else {
$.ajax({
type: "get",
url: "price.php",
data: "id="+$(this).val(),
success: function(data) {
target.val(data);
}
});
}
});
});
</script>

فایل price رو تغییر بدین و کدهای HTML توش رو حذف کنید. فقط تگ PHP توش باشه:


<?php
$hostname='localhost';
$user='root';
$pass='';
$dbname='servicedb';
$link=@mysql_connect($hostname,$user,$pass) ;
@mysql_query("SET NAMES 'utf8'");
@mysql_select_db($dbname) ;
if(!isset($_GET['id']) || !is_numeric($_GET['id'])) {
die('Invalid ID');
}
$id = (int) $_GET['id'];
$product = mysql_query("SELECT * FROM `service_name` WHERE (`ID_SN`='{$id}') ");
if($product && mysql_num_rows($product) == 1) {
$product = mysql_fetch_assoc($product);
echo $product['Price'];
}
else {
echo 'Invalid ID';
}
?>

lady64
یک شنبه 21 خرداد 1391, 12:12 عصر
ممنونم آقای شهرکی . کاملا حل شد و به نتیجه رسیدم .

یک خطایی که از اول برنامه تا الان داشتم و در فایل اصلیم بود نه این فایل ارسالی ، این بود که من هزینه رو در دایو همسایگی ثبت نمیکردم و این موضوع رو با توضیح شما اصلاح کردم :
"شئ div خاصی که id اون با کلمه price شروع میشه و در همسایگی والد شئ جاری (تگ select) هست پیدا میکنه و توی متغیر target میگذاره "

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

MMSHFE
یک شنبه 21 خرداد 1391, 15:34 عصر
در ضمن اون کد رو فعال کردم ولی سایت شما باز نمیشه .
اون بخش از سایت دوباره فعال شده و میتونید از لینک توی امضام استفاده کنید. ممنون.