PDA

View Full Version : مبتدی: مشکل اجرا نشدن شرط



badname
جمعه 17 بهمن 1393, 00:06 صبح
سلام خسته نباشید
یه id و یه name دارم تو دیتابیس ام میخوام شرط بزارم اگه id وجود داشت name رو update کنه
و اگر اون id وجود نداشت یه id و name رو که میگیره و رکورد جدید درست کنه
بصورت زیرنوشتم تو حالتی آپدیت جواب میده ولی وقتی وجود نداره رکورد جدید نمیسازه ...
مشکلش کجاست؟
(تو nodepad نوشتم ببخشید اگه مرتب نیست )




$response = array();
if (isset($_POST['id']) && isset($_POST['name'])) {
$id = $_POST['id'];
$name = $_POST['name'];
require_once __DIR__ . '/db_connect.php';
$db = new DB_CONNECT();
$result = mysql_query("UPDATE users SET name = '$name' WHERE id = '$id'");
if ($result) { $response["success"] = 1;
$response["message"] = "user successfully updated.";
echo json_encode($response); } else {
$response = array();
if (isset($_POST['id']) && isset($_POST['name'])) { $id = $_POST['id'];
$name = $_POST['name'];
require_once __DIR__ . '/db_connect.php';
$db = new DB_CONNECT();
$result = mysql_query("INSERT INTO users(id, name) VALUES('$id', '$name')"); if ($result) {

echo json_encode($response); } else {
echo json_encode($response); }} else {
echo json_encode($response);} }

***BiDaK***
جمعه 17 بهمن 1393, 08:14 صبح
یک راهش اینه که اول سلکت کنی , اگه سطر وجود داشت آپدیت بشه وگرنه اینسرت:

<?php
$response = array();
if (isset($_POST['id']) && isset($_POST['name'])
{
$id = $_POST['id'];
$name = $_POST['name'];
require_once __DIR__ . '/db_connect.php';
$db = new DB_CONNECT();
$result = mysql_query("SELECT COUNT(*) AS `total` FROM `users` WHERE (`id` = '{$id}')");
$result = mysql_fetch_assoc($result);
if ($result['total'] > 0)
{
$result = mysql_query("UPDATE `users` SET `name` = '{$name}' WHERE (`id` = '{$id}')");
if (mysql_affected_rows() > 0)
{
$response["success"] = 1;
$response["message"] = "user successfully updated.";
echo json_encode($response);
}
else
{
$response["success"] = 0;
}
}
else
{
$result = mysql_query("INSERT INTO `users` (`id`, `name`) VALUES('{$id}', '{$name}')");
if (mysql_affected_rows() > 0)
{
$response["success"] = 1;
echo json_encode($response);
}
else
{
$response["success"] = 0;
}
}
}


راه دیگه: اگه فیلد آیدی یونیکه , بجای راه بالا میتونی از یک کوئری استفاده کنی:

$result = mysql_query("INSERT INTO `users` (`id`, `name`) VALUES ('{$id}', '{$name}') ON DUPLICATE KEY UPDATE `name` = '{$name}'");
if (mysql_affected_rows() > 0)
{
$response["success"] = 1;
}

badname
جمعه 17 بهمن 1393, 12:06 عصر
یک راهش اینه که اول سلکت کنی , اگه سطر وجود داشت آپدیت بشه وگرنه اینسرت:

<?php
$response = array();
if (isset($_POST['id']) && isset($_POST['name'])
{
$id = $_POST['id'];
$name = $_POST['name'];
require_once __DIR__ . '/db_connect.php';
$db = new DB_CONNECT();
$result = mysql_query("SELECT COUNT(*) AS `total` FROM `users` WHERE (`id` = '{$id}')");
$result = mysql_fetch_assoc($result);
if ($result['total'] > 0)
{
$result = mysql_query("UPDATE `users` SET `name` = '{$name}' WHERE (`id` = '{$id}')");
if (mysql_affected_rows() > 0)
{
$response["success"] = 1;
$response["message"] = "user successfully updated.";
echo json_encode($response);
}
else
{
$response["success"] = 0;
}
}
else
{
$result = mysql_query("INSERT INTO `users` (`id`, `name`) VALUES('{$id}', '{$name}')");
if (mysql_affected_rows() > 0)
{
$response["success"] = 1;
echo json_encode($response);
}
else
{
$response["success"] = 0;
}
}
}


راه دیگه: اگه فیلد آیدی یونیکه , بجای راه بالا میتونی از یک کوئری استفاده کنی:

$result = mysql_query("INSERT INTO `users` (`id`, `name`) VALUES ('{$id}', '{$name}') ON DUPLICATE KEY UPDATE `name` = '{$name}'");
if (mysql_affected_rows() > 0)
{
$response["success"] = 1;
}


ممنون جناب
***BiDaK*** (http://barnamenevis.org/member.php?245899-***BiDaK***)
تشکر ،
فقط یه مسئله مهم هست که نمیخوام به cpu فشار بیاد ، هاست اشتراکی هست ، کاربرا هم تعداد زیاد.... کدوم رو پیشنهاد میکنید....
( id کاملا یونیک و منحصر به فرده ... )
تا به حال از if (mysql_affected_rows() > 0) استفاده نمیکردم ، حتما باید باشه ؟

badname
جمعه 17 بهمن 1393, 12:44 عصر
حالت دوم رو تست کردم درست کار نکرد ، تو حالت ساخت id جدید مشکل نداشت ، ولی وقتی id تکراری وجود داره name رو آپدیت نمیکنه ، یه رکورد جدید میسازه ...

***BiDaK***
جمعه 17 بهمن 1393, 14:49 عصر
ممنون جناب
***BiDaK*** (http://barnamenevis.org/member.php?245899-***BiDaK***)
تشکر ،
فقط یه مسئله مهم هست که نمیخوام به cpu فشار بیاد ، هاست اشتراکی هست ، کاربرا هم تعداد زیاد.... کدوم رو پیشنهاد میکنید....
( id کاملا یونیک و منحصر به فرده ... )
تا به حال از if(mysql_affected_rows() > 0) استفاده نمیکردم ، حتما باید باشه ؟
والا من تستی که گرفتم , راه اول نتیجه ی بهتری داشت.
شما بهتره از mysqli یا pdo و از متد prepare استفاده کنید.
فیلد آیدی هم auto incerement و primary key باشه.
------------------
اگه تغییری رخ بده مثل insert , update , delete انجام بشه , affected_rows مقدار 1 برمیگردونه.

badname
شنبه 18 بهمن 1393, 10:53 صبح
بله ممنون من هم از راه اول استفاده کردم :لبخندساده:
به تازگی با my_sql آشنا شدم ، تعریف mysqli رو بیشتر شنیدم فکر کنم باید برم سراغ mysqli ...

-------
یه سوال برام پیش اومده درباره ORDER کردن ... طبق کوئری زیر یه لیست 100 تایی از بالاترین رقم تا پایین ترین رقم دارم بدست میارم (name و id شونو بدست میارم ) Top 100 in price

$result = mysql_query("SELECT *FROM `users` ORDER BY `price` DESC LIMIT 100") or die(mysql_error());

چطوری میتونم طوری کوئری بزنم که بفهمم جایگاه id که دارم بهش میدم طبق ORDER BY price چندمه ، حتی اگه جزئ این 100 تا نباشه ....

نمی دونم خیلی پیچیده ست یا من پیچیده گفتم :ناراحت:

***BiDaK***
شنبه 18 بهمن 1393, 13:16 عصر
$query = "select *
from (SELECT id,name, price, (@rn := @rn + 1) as rank
FROM tbl_name cross join
(select @rn := 0) const
ORDER BY price DESC
) as result
where id = $id";

با استفاده از فیلد rank موقیتشو بگیر.

mehrshadms
شنبه 18 بهمن 1393, 15:03 عصر
سلام
mysql , mysqli برای شما تفاوتی نداره که بخوای بری سراغش هرجا که نوشتی mysql بکنش mysqli برای این کار هم یه سلکت بزنید مثلاً
$result = mysqli_query($mysql,"select * from table where id = 0")
بعد یه شرط بذارید به این شکل
if(mysqli_num_rows($result)>0) { echo "duplicate user" }

badname
شنبه 18 بهمن 1393, 15:12 عصر
$query = "select *
from (SELECT id,name, price, (@rn := @rn + 1) as rank
FROM tbl_name cross join
(select @rn := 0) const
ORDER BY price DESC
) as result
where id = $id";

با استفاده از فیلد rank موقیتشو بگیر.
با تشکر از شما :لبخندساده:
به این صورت شد عالی کار میکنه ...

$result = mysql_query("select* from (SELECT `id`,name, price , (@rn := @rn + 1) as rank FROM users cross join (select @rn := 0) const ORDER BY price DESC ) as result where `id` = '$id'");
--------------------------------------
درباره اون راه اول که بالا گفتید یه مسئله ای دارم : این منطقیه که : اگر id از قبل بود میره سراغ آپدیت کردن name اگر name وارد شده هم همون قبلی بود ، باید خطا بده ؟:متفکر:

ممنون :لبخندساده:

***BiDaK***
شنبه 18 بهمن 1393, 15:17 عصر
شما name رو چک کنید و اگر تکراری نبود اینسرت کنید.
آیدی کاربر اهمیتی نداره.
name هم unique است.

badname
شنبه 18 بهمن 1393, 15:52 عصر
شما name رو چک کنید و اگر تکراری نبود اینسرت کنید.
آیدی کاربر اهمیتی نداره.
name هم unique است.
یکی از دوستان پیشنهاد دادن تو همون روش اول که شما گفتید برای name از متد REPLACE استفاده کنم نظرتون چیه ، مشکلی نداره ؟ اصلا امکانش هست

badname
شنبه 18 بهمن 1393, 15:58 عصر
سلام
mysql , mysqli برای شما تفاوتی نداره که بخوای بری سراغش هرجا که نوشتی mysql بکنش mysqli برای این کار هم یه سلکت بزنید مثلاً
$result = mysqli_query($mysql,"select * from table where id = 0")
بعد یه شرط بذارید به این شکل
if(mysqli_num_rows($result)>0) { echo "duplicate user" }
فقط همین ؟
اینجوری که شما میگید یه i اضافه کنم همچی درست میشه ؟ میگن mysqli امن تره در مقابل حملات injection ، یا بهینه تره ...
تو سرعت اجرا ، فشار به سرور هم تاثیری داره ؟
اگه اینطور باشه mysqli کنم همه رو ....