PDA

View Full Version : مشکل در کوئری گروهی



ms_online
دوشنبه 14 مرداد 1398, 22:39 عصر
سلام خدمت دوستان
من سوالم رو به صورت یک مثال مطرح میکنم
من سمت دیتابیس ی جدول دو ستونه دارم که یک ستون نام دانشجو و ستون دیگه نمره اون دانشجو هستش...
حالا من میخوام مثلا ی تعداد دانشجو رو که اسمشون رو داخل یک آرایه ریختم بفرستم سمت دیتا بیس و دونه دونه نمرات رو بگیره و مثلا یک نمره به نمرش اضافه بکنه و باز توو دیتا بیس ذخیره بکنه (update) کنه

من راه های زیادی امتحان کردم ولی بعضی اوقات قاطی میکنه مثلا به ترتیب نمرات رو نمیگره بعضی ها رو اصلا بر نمیگردونه بعضی ها رو نمرش رو که مثلا برای آرایه خونه 2 هست رو نمره آرایه خونه 3 رو بر میگردونه ...
شما دوستان چه راه حلی برای اراسل و دریافت گروهی به سمت دیتابیس دارید ...
دیتابیس سمت سرور mysql میباشد

پیشاپیش از پاسخ شما متشکرم ....

محمد رضا فاتحی
سه شنبه 15 مرداد 1398, 12:43 عصر
من خودم به صورت json مبفرستم و اطلاعات رو به صورت jsonمیگریم و پردازش می کنم

Nevercom
سه شنبه 15 مرداد 1398, 14:59 عصر
الان مساله‌ی اصلی روش ارسال اطلاعات به سرور هست که بشه بر اساس اون کوئری رو اجرا کرد ؟ (گمان نمیکنم این باشه)
یا مشکل در نوشتن کوئری هست ؟

چون از دید من مشکلی نباید وجود داشته باشه، لیست رو در یه JsonArray بفرستید (یا حتی یه String که با ٫ از هم جدا شدن) و بعد هم از این لیست در کوئری استفاده کنید (اپراتور IN).

بنظرم لازمه مشکلتون رو بهتر تشریح کنید و شاید تکه هایی از کد فعلیتون رو هم قرار بدید

ms_online
سه شنبه 15 مرداد 1398, 19:51 عصر
سلام
ممنون از پاسخ
مشکل اینجاست وقتی داده ها بر میگردن مثلا اولی رو 2تا بهش اضافه میکنه میشه 10 بقیه داده هایی که تووو آرایه اولی بهش گفتی برو مقدارش بیار تا اضافه کنم و اپدیت کنم همشونو میده ده !!
یعنی داده های بعدی رو اصلا نمیاره داخل حلقه و تابع جمع و کل مقادیر داخل آرایه رو با مقدار اولی آپذیت میکنه ...




: سمت سرور
$codemeli = $panel->checkPost($_POST['codemeli']);
$time_operation = $panel->checkPost($_POST['time_operation']);
$date_operation = $panel->checkPost($_POST['date_operation']);
$count_turn_new = $panel->checkPost($_POST['count_turn_new']);
$count_turn = $panel->checkPost($_POST['count_turn']);
$date_turn = $panel->checkPost($_POST['date_turn']);
$code_marja = $panel->checkPost($_POST['code_marja']);

$sql = $pdo->prepare("SELECT * FROM `report_doctors` WHERE date_turn = :date AND codemeli_dr = :codemeli");
$sql->bindParam(":codemeli",$codemeli);
$sql->bindParam(":date",$date_turn);
$sql->execute();
$rowcount = $sql->rowCount() ;
if($rowcount > 0 )
{
$sql = $pdo->prepare("UPDATE `report_doctors` SET count_turn = :count_turn WHERE date_turn IN(:date) AND codemeli_dr = :codemeli order by date_turn asc");
$sql->bindParam(":count_turn",$count_turn);
$sql->bindParam(":codemeli",$codemeli);
$sql->bindParam(":date",$date_turn);
$sql->execute();
}

else
{

$sql = $pdo->prepare("INSERT INTO `report_doctors`(`code_marja`,`date`,`date_turn`, `time`, `count_turn`, `count_rezerv`, `count_cancell`, `count_delete`, `codemeli_dr`, `type`)
VALUES (:code_marja,:date_operation,:date_turn,:time_oper ation,:count_turns,'0','0','0',:codemeli_dr,'1')");

$sql->bindParam(":date_operation",$date_operation);
$sql->bindParam(":time_operation",$time_operation);
$sql->bindParam(":count_turns",$count_turn_new);
$sql->bindParam(":date_turn",$date_turn);
$sql->bindParam(":codemeli_dr",$codemeli);
$sql->bindParam(":code_marja",$code_marja);
$sql->execute();
$rowcount = $sql->rowCount() ;
if($rowcount > 0 )
{
echo "ok";

}
else
{
echo 'no' ;
}

}



کد سمت اندروید




for (int i = 0; i < AutoTurnRatingsDoctor.mySelectedDates.size(); i++)
{


int finalI = i;
for (int j = 0; j < countTurnList.size(); j++) {
int finalj = j;


StringRequest request = new StringRequest(1, ContactUtils.sendTurnUrl, response ->
{
if (response.trim().equals("no"))
{
Toast.makeText(context, ContactUtils.noData, Toast.LENGTH_SHORT).show();
}
else
{
if (finalj == 0)
{
SpecialFunction.DialogTaeedTurn(context, null, PanelDoctor.name + " عزیز" +
" شما " + AutoTurnRatingsDoctor.countTurns + " شما " + AutoTurnRatingsDoctor.mySelectedDates.size()
+ " تاریخ با کد " + code_marja + " ثبت کرده اید", 1);
}
}
}, error ->
{
SpecialFunction.parseVolleyError(context, error);
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> stringMap = new HashMap<String, String>();
stringMap.put("key", "reportInsertDoctor");
stringMap.put("code_marja", code_marja);
stringMap.put("date_turn", AutoTurnRatingsDoctor.mySelectedDates.get(finalI)) ;
stringMap.put("time_operation", SpecialFunction.getTimeNow());
stringMap.put("date_operation", SpecialFunction.getDatePersian());
stringMap.put("count_turn_new", String.valueOf(AutoTurnRatingsDoctor.countTurns / AutoTurnRatingsDoctor.mySelectedDates.size()));
stringMap.put("count_turn", countTurnList.get(finalj) + "");




stringMap.put("codemeli", S_codemeli);
return stringMap;
}
};
request.setRetryPolicy(ContactUtils.RETRY_POLICY);
AppSingleton.getInstance(context).addToRequestQueu e(request);
}
}

Nevercom
سه شنبه 15 مرداد 1398, 23:11 عصر
تو کد شما (سمت سرور) من حلقه‌ای نمی‌بینم و در کوئری هم جمع یا افزایش مقدار فیلد رو نمی‌بینم. در ابتدا یه SELECT دارید که از نتیجه‌ی کوئری هیچ استفاده‌ای نمیشه (فقط چک میکنید که اگر نتیجه ای دریافت شده باشه، عملیات آپدیت انجام بشه). در آپدیت هم میگید که مقدار فیلد count_turn رو دقیقن برابر مقداری قرار بده که از سمت کلاینت ارسال شده (و نه اینکه با مقدار فعلیش جمع بشه)

رفتار مدنظر شما چیه ؟ من کدهاتون رو دیدم، اما هنوز هم دقیق توضیح ندادید که هدف نهایی چیه. تا مشخص نباشه هدف شما چیه، نمیشه تشخیص داد که منطق کدتون ایرادی داره یا نه.

ms_online
چهارشنبه 16 مرداد 1398, 01:25 صبح
کد اضافه کردن توی کلاینت همزمان ک مقدار رو میگیرم با جیسون توی ارایه میریزم همون جا اضافه میکنم

JSONArray jsonArray = response.getJSONArray(ContactUtils.text.dataJsonOb jectName);
JSONObject jsonObject = jsonArray.getJSONObject(0);
countTurnList.add(jsonObject.getInt("count_turn") + AutoTurnRatingsDoctor.countTurns);

خط سوم را نگاه کنید من هم میگیرم از سرور هم همزمان جمع میکنم با مقداری ک از صفحه قبل میاد

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

حلقه رو نمیشه برد سمت سرور چون امکان پذیر نیست

در ضمن مقدار ارایه به عنوان مثال این ارایه تاریخ ها از صفحه قبل گرفتم ک اگه بیش از دو تا تاریخ در ارایه باشه بخوام توی قسمت تابعی ک دو تا حلقه داره ک عملیات ابدیت رو انجام بده مقدار turn_turn توی جدول کب عنوان مثال توی جدول سه تا سطر با تاریخ های مجزا و ی ستون ب نام count_turn هست مقدار دهی از قبل شده میخوام ستون همین count_turn با مقداری ک توی کلاینت اندرویذ اضافه مکینم توی این ستون ابدیت بشه بر اساس تاریخ هایی ک توی ارایه هست میدم اما مشکل اینجاست که اگه من توی سطر اول جدول ستون count_turn عدد 50 باشه و توی کلاینت این عدد 50 رو ک گرفتم با ی عددی اضافه کنم و برگردونم توی سرور و ابدیت بشه این ک بیاد بذاره توی سطر اول میاد ب هر سه سطر ک تاریخ ها رو از کلاینت گرفتم ابدیت میکنه در صورتی ک من گفتم تاریخ اولی یا همون سطر اولی عدد 50 بشه 70 و سطر دومی اگه عدد 80 بود بشه 100 و الی اخر ک این طور نیست میاد همون عدد اول ک شده 70 ب بقیه هم 70 میده