درج و فراخوانی از دیتابیس

masima

Member
شما چی تو کوئری گذاشتید، لطفا یه کم دقت کنید!
چیزی که شما توی کوئری گذاشتید $mid . شما باید $members-mid رو قرار بدین!

نگفتید دستور clean چیه؟

خطایی براش تعریف نشده که نشون داده بشه
؟؟؟ !!!!
 

Masoud1365

مدیر انجمن
اگه میشه کدهاتون رو + فایل دیتا بیس اینجا بزارید فکر کنم اینجوری راحت تره !
بعدشم این $members-mid چیه ؟ تو اسم متغیر که نمیشه از - استفاده کرد !
 

tinya

Member
این فایل دیتابیس هست که دو تا جدول داریم و کلید خارجی تعریف کردم:

کد:
CREATE TABLE `members` (
  `mid` int(11) NOT NULL AUTO_INCREMENT,
  `firstname` varchar(100) NOT NULL,
  `lastname` varchar(100) NOT NULL,
  `email` varchar(100) NOT NULL,
  `username` varchar(100) NOT NULL,
  `password` varchar(32) NOT NULL,
  `verifycode` varchar(100) NOT NULL,
  `active` bit(1) NOT NULL,
  PRIMARY KEY (`mid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
CREATE TABLE `subjects` (
  `bid` int(11) NOT NULL AUTO_INCREMENT,
  `sub` varchar(100) NOT NULL,
  `draft` varchar(100) NOT NULL,
  `place` varchar(100) NOT NULL,
  `message` varchar(100) NOT NULL,
  `date` timestamp NOT NULL,
  `members_mid` INT NOT NULL,
  INDEX (`members_mid`),
  FOREIGN KEY (`members_mid`)
  REFERENCES `members`(`mid`)
  ON DELETE CASCADE ON UPDATE CASCADE,
  PRIMARY KEY (`bid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

بعد از پر کردن فرم و ساب میت کردن، اطلاعات به این صفحه منتقل میشه و پس از صحت اطلاعات در دیتابیس ذخیره میشه:

PHP:
<?php
 session_start();
 
 require_once('config.php');
 
 $errmsg_arr = array();
 
 $errflag = false;
 
 $link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
 if(!$link) {
  die('Failed to connect to server: ' . mysql_error());
 }
 
 $db = mysql_select_db(DB_DATABASE);
 if(!$db) {
  die("Unable to select database");
 }
 
 function clean($str) {
  $str = @trim($str);
  if(get_magic_quotes_gpc()) {
   $str = stripslashes($str);
  }
  return mysql_real_escape_string($str);
 }
 
 $sub = clean($_POST['sub']);
 $draft = clean($_POST['draft']);
 $place = clean($_POST['place']);
 $message = clean($_POST['message']);
 $mid = clean($_POST['mid']);
 
 $qry = "INSERT INTO subjects(sub, draft, place, message, members_mid) VALUES('$sub','$draft','$place','$message','$mid')";
 $result = @mysql_query($qry);
 
 if($result) {
  header("location: index.php");
  exit();
 }else {
  die("Query failed");
 }
?>

شما چی تو کوئری گذاشتید، لطفا یه کم دقت کنید!
چیزی که شما توی کوئری گذاشتید $mid . شما باید $members-mid رو قرار بدین!

نگفتید دستور clean چیه؟

members_mid ستونی در دیتابیس هست که می خوام مقدار id کاربر که همون mid هست در اون ریخته بشه

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

masima

Member
مورد اول:
members_mid ستونی در دیتابیس هست که می خوام مقدار id کاربر که همون mid هست در اون ریخته بش
میدونم members_mid ستون جدولتونه! ولی من میگفتم $members_mid (که یک متغیره!) رو چرا داخل کوئری نذاشتین و جاش $mid گذاشتین؟
که خوب بدون اینکه متوجه بشین درستش کردین (به کوئری که قبلا نوشتین مراجعه بفرمایید تا دلیل اینکه گفتم $members_id رو به جای $mid قرار بدین متوجه بشین! )

مورد دوم :
PHP:
$qry = "INSERT INTO books(sub, draft, place, message, members_mid) VALUES('$sub','$draft','$place','$message','$mid')";
من اینجا جدولی به نام books نمی بینم! باید subjects بذارید جاش.

مورد سوم:
از اونجایی که احتمال میدم ممکنه آرگومان های کوئری تون مقدار نداشته باشن، بهتره اول مطمئن بشید که مقدار دارن.
PHP:
$sub = clean($_POST['sub']);
 $draft = clean($_POST['draft']);
 $place = clean($_POST['place']);
 $message = clean($_POST['message']);
if( isset( $_POST['mid'] ) )
 $mid = clean($_POST['mid']);
else 
 echo "mid is not exist!";
 $qry = "INSERT INTO subjects(sub, draft, place, message, members_mid) VALUES('$sub','$draft','$place','$message','$mid')";
 $result = mysql_query($qry);
 
 if($result) {
  header("location: index.php");
  exit();
 }else {
  die("Query failed");
مورد چهارم :
میدونید دلیل این همه اشتباه شما چیه؟
از اول این تاپیک که بخونید شما تا به حال چند تا جدول مختلف با نام های مختلف و متغیرهای مختلف تعریف کردین. این خودش باعث اشتباه و بی دقتی میشه!

مورد پنجم:
این علامت @ که قبل از تابع هاتون گذاشتید چیه؟ به نظرم بردارینش!
امیدوارم دیگه مشکلی نباشه!

 
آخرین ویرایش:

tinya

Member
با همه این تلاش ها باز هم نشد... (چیزی در دیتابیس ثبت نمی کنه و از سطری که کوئری نوشته شده ایراد می گیره)

در کل همه چیز درسته و در دیتابیس ثبت می شه ولی وقتی کلید خارجی رو در دیتابیس ایجاد کردم، این مشکل شکل گرفته...
 

masima

Member
کد هیچ مشکلی نداره!

نکنه جدول members شما خالیه؟؟؟

در هنگام درج در جدول فرزند ، موتور دیتابیس بررسی میکند ببیند آیا کلید خارجی در جدول فرزند با کلید اصلی در جدول پدر متناظر است یا نه؟
اگر همچین کلید اصلی را در جدول پدر پیدا نکند، هرگز هیچ سطری در جدول فرزند درج نمیکند!

به عبارت دیگه، آیا وقتی دارید یک سطر به جدول subjects اضافه میکنید، بررسی کردید ببینید آیا مقدار $mid که توی کوئری گذاشتید، توی جدول members همچین شخصی هست یا نه؟

من کدها رو تست کردم هیچ مشکلی نداره!

یک توصیه:
همیشه نام دیتابیس رو داخل تک کوتیشن (یا دابل) بگذارید.
$db = mysql_select_db('DB_DATABASE');
یک سفارش دوستانه :
وقتی میگید یه کد خطا میده، متن خطا رو بنویسید، تا کسی که میخواد کمک کنه، متوجه منظور شما بشه !
من یه جعبه دستم هست الان، میتونید حدس بزنید توش چیه؟؟ !!
 

tinya

Member
خوب در جدول members اطلاعات کاربران هست که ثبت نام کردند و در mid هم id کاربران اتوماتیک ثبت شده (مثلا 1)

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

خطایی گزارش نمی شه فقط زمانی که کاربر اطلاعات فیلد رو ارسال می کنه، چیزی در جدول دوم ثبت نمی شه

منظور از خطا زمانی هست که در localhost تست می کردم و از سطری که کوئری درج شده بود ایراد می گرفت

کد:
Notice: Undefined variable: mid in C:\wamp\www\local\insert.php on line 34
 

Masoud1365

مدیر انجمن
این ارروری که اینجا نوشتید البته ارور نیست ! هشدار هست ولی خب خیلی مهم هست چون در خط 34 شما متغیرس که استفاده کردید ( mid ) مقدار دهی نشده ! یعنی کلا تعریف نشده هست :wink:
 

tinya

Member
ولی آرگومان های کوئری که همگی مقدار دهی شدند...

لطفا بفرمائید چه تغییری اعمال کنیم...
 

Masoud1365

مدیر انجمن
این $_POST['mid'] خالی هست ! این باید id اون یکی جدول باشه ! برا همین گیر میده !
 

tinya

Member
در جدول اول که مربوط به اطلاعات ثبت نام کاربران هست، mid درواقع شماره id کاربران هست که بصورت خودکار تعلق می گیره

و در جدول شماره دو هم می خواهیم این مقدار درج بشه (کلید خارجی)

این id بصورت خودکار موقع ارسال اطلاعات توسد کاربر، در جدول باید ثبت بشه

لطفا اگر نکته ای هست بفرمائید...
 

masima

Member
در جدول اول که مربوط به اطلاعات ثبت نام کاربران هست، mid درواقع شماره id کاربران هست که بصورت خودکار تعلق می گیره
و در جدول شماره دو هم می خواهیم این مقدار درج بشه (کلید خارجی)
این id بصورت خودکار موقع ارسال اطلاعات توسد کاربر، در جدول باید ثبت بشه

چرا دقت نمیکنید
وقتی کاربر لاگین میکنه، آیا شما آیدی اون رو واکشی کردین؟ آیا به آیدیش دسترسی دارین، که اونو داخل
PHP:
$_POST['mid']
گذاشتید؟
آیا توی کدی که قبلا براتون نوشته بودم
PHP:
if( isset( $_POST['mid'] ) )
 $mid = clean($_POST['mid']);
else 
 echo "mid is not exist!";
این mid is not exist! چاپ میشده؟ و شما اونو به من نگفتید؟

من فکر نمیکنم، این سوال مشکل شما این قدر پیچیده باشه .....
میدونید این پست 34 هست برای چنین سوال ساده ای!

خوب مشکل همینه که متوجه نشدیم دیگه...
!!!! منظورتون من که نیست؟ !
 

tinya

Member
دلیل این که پست طولانی شده اینه که به سوال دقیقا دقت نمیشه
مثلا همین شما تازه متوجه شدید که کاربر لاگین می کنه... و کدی که خودتون پیشنهاد دادید رو زیر سوال می برید
همانند تغییراتی که شما گفتید اجرا کردم ولی نشد و پیام mid is not exist رو هم نداد!!
و ایرادی که آقای مسعود گرفت هم به همین بر می گرده

این سوال هر قدر هم برای شما ساده باشه ولی برای من اینطور نیست در غیر این صورت نمی اومدم مزاحم دوستان بشم
اینجا یه فروم برای مطرح کردن سوال هست و اگر کسی می تونه پاسخ رو ارائه می ده و کمک می کنه
شما هم اگر براتون زحمت شده عذر خواهی می کنم...

منم بی خیال این قضیه شدم... ممنون از همگی
 

masima

Member
عزیزم من تازه متوجه این لاگین نشدم !
منظور چیزی که شما میخواین من توی اولین پستتون فهمیدم!
و خودم هم در اولین تلاشم برای نوشتن کد که همین دیشب بود( که گفتم تست کرد) بدون مشکل ایجاد شد !

مشکل توی این کدها که نوشتین نبود حتما از صفحه ای هست که اطلاعات رو به این صفحه میفرسته!
میتونید بگید چه جوری آیدی کاربر رو واکشی کردین و به این صفحه فرستادین؟

شما مزاحم من نشدین! اشتباه نشه!
من خوشحال میشم کمکتون کنم ولی مشکل اینه که شما خیلی سربسته حرف میزنید !
نه از اورها دقیق میگید نه کدها کامل هستن!
مثل اینه که شما توی یه اتاق دربسته دارین با یه دیو دو سر میجنگید و تنها فریاد میزنید میگید نمیشه! نشد! ارور داد! :)
:rose:
 

masima

Member
کدی که دیروز نوشتم میذارم:

خوب با نبودن صفحه config.php !! و صفحه ای که اطلاعات رو به این صفحه میفرسته !! یکمی با کد شما فرق داره که البته کوتاهی از بنده نیست!
دیتابیس همون هست که شما کد دادین و اینکه در جدول members کسانی عضو هستند مثلا با mid های 1 و2 و ...

صفحه اول :
PHP:
<html>
<title>insert - fetch page1</title>
<body>
<form action="insert-fetch.php" method="post">
    sub = 
    <input type="text" name="sub"  /></br>
    draft = 
    <input type="text" name="draft"  /></br>
    place = 
    <input type="text" name="place"  /></br>
    message = 
    <input type="text" name="message"  /></br>
    <?php 
    $link = mysql_connect("localhost", "root", "");
    $db = mysql_select_db('DB_DATABASE');
    if(!$db) {
    die("Unable to select database");
    }
    
    //bayad be jaye 'u' username karbari ke login karde bezarid !
    //man yek karbar ba username 'u' daram
    $qry = mysql_query("select * from `members` where username='u' limit 1");
    $row = mysql_fetch_assoc($qry);
    $mid = $row['mid'];
    echo "mid = ".$mid;
    if($mid) {
        echo "<input type='hidden' name='mid' value=".$mid."/></br>";
    }
    else
        echo "</br> error! this user never exist!";
    ?>
    <input type="submit" value="send data"  />
</form>
</body>
</html>

صفحه insert-fetch.php :
PHP:
<?php
 session_start();
 //require_once('config.php');
 $errmsg_arr = array();
 $errflag = false;
 //$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
 $link = mysql_connect("localhost", "root", "");
 if(!$link) {
  die('Failed to connect to server: ' . mysql_error());
 }
 
 $db = mysql_select_db('DB_DATABASE');
 if(!$db) {
  die("Unable to select database");
 }
 
 function clean($str) {
  $str = @trim($str);
  if(get_magic_quotes_gpc()) {
   $str = stripslashes($str);
  }
  return mysql_real_escape_string($str);
 }
 
 if( isset( $_POST['sub'] ) ) 
     {$sub = clean($_POST['sub']);
    echo "$sub"."</br>";
    }
 else
     echo "sub does not exist!"."</br>";
 //------------------------------------
 if( isset( $_POST['draft'] ) ) 
     {$draft = clean($_POST['draft']);
    echo "$draft"."</br>";
    }
 else
     echo "draft does not exist!"."</br>";
 //------------------------------------
 if( isset( $_POST['place'] ) ) 
     {$place = clean($_POST['place']);
    echo "$place"."</br>";
    }
 else
     echo "place does not exist!"."</br>";
 //------------------------------------
 if( isset( $_POST['message'] ) ) 
     {$message = clean($_POST['message']);
    echo "$message"."</br>";
    }
 else
     echo "message does not exist!"."</br>";
 //------------------------------------
 if( isset( $_POST['mid'] ) ) 
     {$mid = clean($_POST['mid']);
    echo "$mid"."</br>";
    }
 else
     echo "mid does not exist!"."</br>";
 //------------------------------------
 $qry = "INSERT INTO subjects(sub, draft, place, message, members_mid) VALUES('$sub','$draft','$place','$message','$mid')";
 $result = mysql_query($qry);
 
 if($result) {
  //header("location: index.php");
  echo "complete!"."</br>";
  exit();
 }else {
  die("Query failed");
 }
?>
خوب میبینید که من و آقا مسعود اشکال تمام کدهایی که گذاشتید رو گرفتیم! و مشکل توی کدهایی بوده که شما نذاشتید!
و اگر پس اصرارهای زیاد اینجانب و آقا مسعود برای گذاشتن پیغام های خطا و کدهای کامل، پس از چند روز درخواست شما اون هشدار مبنی بر تعریف نشدن $mid رو دیشب گذاشتید ، می بینیم چه کسی پاسخ ها رو با دقت نخونده ؟! (خوبه کمی انصاف را رعایت کنیم!)
خوب اگه شما از اول همه پاسخ ها رو خونده بودین مطمئنم که میتونستید به جواب برسید .

این روش فرستادن mid با استفاده از $_POST هست. اگه بخواین میتونید همین mid رو با استفاده از $_GET هم انتقال بدین مثل چیزی که آقا مسعود توی همون پست های ابتدا ! گفتن که میشه mid رو با استفاده از url هم منتقل کرد . اگه شما باز هم با دقت خونده بودین، همه این موارد به راحتی حل میشد
موفق باشید:)
 

azinne

New Member
تفاوت های sql با access چیه؟
access هم مثل sql قابلیت شبکه شدن را داره؟
کلا اگه تفاوت هایش را توضیح بدین ممنون ماشم؟
 

tinya

Member
بازهم ممنون
فکر می کنم منظورتون این صفحات بود... گذاشتم که ببینیم تفاوت کار در کجا بوده

با تشکر

config
PHP:
<?php
    define('DB_HOST', 'localhost');
    define('DB_USER', 'root');
    define('DB_PASSWORD', '');
    define('DB_DATABASE', 'dbt');
?>

auth
PHP:
<?php
 session_start();
 
 if(!isset($_SESSION['SESS_MID']) || (trim($_SESSION['SESS_MID']) == '')) {
  header("location: index.php");
  exit();
 }
?>

PHP:
<?php
 require_once('auth.php');
?>
<html>
<head>
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
  <div class="create">
    <form method="post" action="send.php">
<table border="0" cellspacing="0" cellpadding="0" height="30" class="dp">
 <tr>
  <td width="123">&nbsp;</td>
  <td width="180" class="bc">ارسال کننده: <?php echo $_SESSION['SESS_FIRSTNAME'];?> <?php echo $_SESSION['SESS_LASTNAME'];?></td>
 </tr>
</table>
      <label>موضوع:</label>
      <input name="sub" type="text" value="" id="sub" class="form" />
      <br />
      <label>درفت:</label>
      <input name="draft" type="text" value="" id="draft" class="form" />
      <br />
      <label >محل:</label>
      <input name="place" type="text" value="" id="place" class="form" />
      <br />
      <label for="text">متن:</label>
      <textarea name="message" id="message" class="text"></textarea>
      <br />
      <label></label>
      <input name="" type="submit" value=" ارسال " class="btn" />
    </form>
  </div>
</body>
</html>
 

masima

Member
خیلی روشنه مشکل کجاست!
همونجور که خیلی پیش تر گفته بودم، شما اصلا آیدی طرف رو واکشی نکردید از دیتابیس!
(این بیچاره از کجا بفهمه کی داره اطلاعات میفرسته! شما اسم و فامیل طرف رو از توی سشن درآوردید ولی آیدی رو در اختیار ندارید! )

اگه به کد صفحه 1 بنده مراجعه کنید ، همونجایی که آیدی طرف رو از جدول اعضا درآوردم، میتونید مقایسه کنید که اصلا همچین کاری توی کد شما صورت نگرفته!

تفاوتی که کد من با شما داره اینه که من اصل در لاگین رو نام کاربری قرار دادم و آیدی طرف رو اصلا در هیچ جا مثلا سشن ذخیره نمیکنم و هر وقت که نیاز داشتم اون رو بر اساس نام کاربری واکشی میکنم. مثل همون که انجام دادم.
ولی کد شما به نظر میرسه بعد از لاگین آیدی طرف رو در سشن ذخیره میکنه پس به نظر میرسه نباید این صفحه رو تغییر بدین و فقط نیاز هست صفحه send.php رو تغییر بدین
چند راه راه داریدکه من ساده ترین رو میگم :
1) اگه اشتباه نکنم $_SESSION['SESS_MID'] باید آیدی کاربر باشه، درسته؟
خوب اینجوری فقط کافیه :
کد
PHP:
<?php
 require_once('auth.php');
?>
رو مثل همین صفحه که گذاشتین بالای صفحه send.php بذارین و داخل کوئری که توی جدول subjects ثبت میشه
$_SESSION['SESS_MID'] رو توی همون مقدار آیدی شخص بذارین.همین!

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

سخن آخر:
آخه اگه همین کد همون اول میذاشتید این همه کار سخت و پیچیده و طولانی نمیشد!
موفق باشید. Bye
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا