Solved

form within a form? or another way

Posted on 2008-10-03
13
220 Views
Last Modified: 2013-12-12
I have the following code below that when clicked submit button submits the form and goes to different section. Now I want to have another submit button that when its clicked the form stays on the same page.
The action property of that button should be
<form enctype="multipart/form-data" action="test.php?a=edit&recid=<?php echo $_SESSION["recid"]; ?>" method="post">
The problem is how to make button behave within the same form so it does a totally different thing from the first button.
Please see my complete code below. Thanks

<?php session_start();

 

?>

 

<?php

  $conn = connect();

  $showrecs = 20;

  $pagerange = 10;

 

  $a = @$_GET["a"];

  $recid = @$_GET["recid"];

  $page = @$_GET["page"];

  if (!isset($page)) $page = 1;

 

  $sql = @$_POST["sql"];

 

  switch ($sql) {

    case "update":

      sql_update();

      break;

  }

 

  switch ($a) {

    case "edit":

      editrec($recid);

      break;

    default:

      select();

      break;

  }

 

 

  mysql_close($conn);

?>

<table class="bd" width="100%"><tr><td class="hr"></td></tr></table>

</body>

</html>

 

<?php function select()

  {

  global $a;

  global $showrecs;

  global $page;

 

  $res = sql_select();

  $count = sql_getrecordcount();

  if ($count % $showrecs != 0) {

    $pagecount = intval($count / $showrecs) + 1;

  }

  else {

    $pagecount = intval($count / $showrecs);

  }

  $startrec = $showrecs * ($page - 1);

  if ($startrec < $count) {mysql_data_seek($res, $startrec);}

  $reccount = min($showrecs * $page, $count);

?>

<table class="bd" border="0" cellspacing="1" cellpadding="4">

<tr><td>Table: test</td></tr>

<tr><td>Records shown <?php echo $startrec + 1 ?> - <?php echo $reccount ?> of <?php echo $count ?></td></tr>

</table>

<hr size="1" noshade>

<?php showpagenav($page, $pagecount); ?>

<br>

<table class="tbl" border="0" cellspacing="1" cellpadding="5"width="100%">

<tr>

<td class="hr">&nbsp;</td>

<td class="hr"><?php echo "ID" ?></td>

</tr>

<?php

  for ($i = $startrec; $i < $reccount; $i++)

  {

    $row = mysql_fetch_assoc($res);

    $style = "dr";

    if ($i % 2 != 0) {

      $style = "sr";

    }

?>

<tr>

<td class="<?php echo $style ?>"><a href="test.php?a=edit&recid=<?php echo $i ?>">Edit</a></td>

<td class="<?php echo $style ?>"><?php echo htmlspecialchars($row["ID"]) ?></td>

</tr>

<?php

  }

  mysql_free_result($res);

?>

</table>

<br>

<?php showpagenav($page, $pagecount); ?>

<?php } ?>

 

<?php function showroweditor($row, $iseditmode)

  {

  global $conn;

?>

<table class="tbl" border="0" cellspacing="1" cellpadding="5"width="50%">

<tr>

<td class="hr"><?php echo htmlspecialchars("ID")."&nbsp;" ?></td>

<td class="dr"><input type="text" name="ID" value="<?php echo str_replace('"', '&quot;', trim($row["ID"])) ?>"></td>

</tr>

</table>

<?php } ?>

 

<?php function showpagenav($page, $pagecount)

{

?>

<table class="bd" border="0" cellspacing="1" cellpadding="4">

<tr>

<?php if ($page > 1) { ?>

<td><a href="test.php?page=<?php echo $page - 1 ?>">&lt;&lt;&nbsp;Prev</a>&nbsp;</td>

<?php } ?>

<?php

  global $pagerange;

 

  if ($pagecount > 1) {

 

  if ($pagecount % $pagerange != 0) {

    $rangecount = intval($pagecount / $pagerange) + 1;

  }

  else {

    $rangecount = intval($pagecount / $pagerange);

  }

  for ($i = 1; $i < $rangecount + 1; $i++) {

    $startpage = (($i - 1) * $pagerange) + 1;

    $count = min($i * $pagerange, $pagecount);

 

    if ((($page >= $startpage) && ($page <= ($i * $pagerange)))) {

      for ($j = $startpage; $j < $count + 1; $j++) {

        if ($j == $page) {

?>

<td><b><?php echo $j ?></b></td>

<?php } else { ?>

<td><a href="test.php?page=<?php echo $j ?>"><?php echo $j ?></a></td>

<?php } } } else { ?>

<td><a href="test.php?page=<?php echo $startpage ?>"><?php echo $startpage ."..." .$count ?></a></td>

<?php } } } ?>

<?php if ($page < $pagecount) { ?>

<td>&nbsp;<a href="test.php?page=<?php echo $page + 1 ?>">Next&nbsp;&gt;&gt;</a>&nbsp;</td>

<?php } ?>

</tr>

</table>

<?php } ?>

 

<?php function showrecnav($a, $recid, $count)

{

?>

<table class="bd" border="0" cellspacing="1" cellpadding="4">

<tr>

<td><a href="test.php">Index Page</a></td>

<?php if ($recid > 0) { ?>

<td><a href="test.php?a=<?php echo $a ?>&recid=<?php echo $recid - 1 ?>">Prior Record</a></td>

<?php } if ($recid < $count - 1) { ?>

<td><a href="test.php?a=<?php echo $a ?>&recid=<?php echo $recid + 1 ?>">Next Record</a></td>

<?php } ?>

</tr>

</table>

<hr size="1" noshade>

<?php } ?>

 

<?php function editrec($recid)

{

  $res = sql_select();

  $count = sql_getrecordcount();

  mysql_data_seek($res, $recid);

  $row = mysql_fetch_assoc($res);

  showrecnav("edit", $recid, $count);

?>

<br>

<!-- if I copy another form statement here it makes another new form, which is not what I want -->

<form enctype="multipart/form-data" action="test.php" method="post">

<input type="hidden" name="sql" value="update">

<input type="hidden" name="xID" value="<?php echo $row["ID"] ?>">

<?php showroweditor($row, true); ?>

<p><input type="submit" name="action" value="Post"></p>

</form>

<?php

  mysql_free_result($res);

} ?>

 

<?php function connect()

{

  $conn = mysql_connect("localhost", "user", "password");

  mysql_select_db("mydb");

  return $conn;

}

 

function sqlvalue($val, $quote)

{

  if ($quote)

    $tmp = sqlstr($val);

  else

    $tmp = $val;

  if ($tmp == "")

    $tmp = "NULL";

  elseif ($quote)

    $tmp = "'".$tmp."'";

  return $tmp;

}

 

function sqlstr($val)

{

  return str_replace("'", "''", $val);

}

 

function sql_select()

{

  global $conn;

  $sql = "SELECT ID FROM `test`";

  $res = mysql_query($sql, $conn) or die(mysql_error());

  return $res;

}

 

function sql_getrecordcount()

{

  global $conn;

  $sql = "SELECT COUNT(*) FROM `test`";

  $res = mysql_query($sql, $conn) or die(mysql_error());

  $row = mysql_fetch_assoc($res);

  reset($row);

  return current($row);

}

 

function sql_update()

{

  global $conn;

  global $_POST;

 

  $sql = "update `test` set ID=" .sqlvalue(@$_POST["ID"], false) ." where " .primarykeycondition();

  mysql_query($sql, $conn) or die(mysql_error());

}

function primarykeycondition()

{

  global $_POST;

  $pk = "";

  $pk .= "(ID";

  if (@$_POST["xID"] == "") {

    $pk .= " IS NULL";

  }else{

  $pk .= " = " .sqlvalue(@$_POST["xID"], false);

  };

  $pk .= ")";

  return $pk;

}

 ?>

Open in new window

0
Comment
Question by:syedasimmeesaq
  • 8
  • 5
13 Comments
 
LVL 82

Expert Comment

by:hielo
Comment Utility
you CANNOT have nested forms.

>> Now I want to have another submit button that when its clicked the form stays on the same page.
If you want to remain on the page, then use a type="button" instead of a type="submit"
0
 
LVL 9

Author Comment

by:syedasimmeesaq
Comment Utility
if I use button it doesn't submit the data
thanks
0
 
LVL 82

Expert Comment

by:hielo
Comment Utility
try:
...

<!-- if I copy another form statement here it makes another new form, which is not what I want -->

<?php

//provide an array that mapst the value of the button to the desired destination

$actionValues=array();

$actionValues['Post']='test.php';

$actionValues['Other Button']='test.php?a=edit&recid=' .$_SESSION["recid"];

?>
 

<form enctype="multipart/form-data" action="<?php echo $actionValues[ $_POST['action'] ];?>" method="post">

<input type="hidden" name="sql" value="update">

<input type="hidden" name="xID" value="<?php echo $row["ID"] ?>">

<?php showroweditor($row, true); ?>

<p><input type="submit" name="action" value="Post"></p>

<p><input type="submit" name="action" value="Other Button"></p>

</form>

...

Open in new window

0
 
LVL 9

Author Comment

by:syedasimmeesaq
Comment Utility
thanks heilo thats what I wanted. Just one problem though, why doesn't it save data? When I change it to what you suggested it works the way I want it to but doesn't update my table or change data.
Thanks
0
 
LVL 9

Author Comment

by:syedasimmeesaq
Comment Utility
ok i see what was the problem with update. But now here is the new problem.
$actionValues['Post']='test.php';
$actionValues['Other Button']='test.php?a=edit&recid=' .$_SESSION["recid"];

if the user hit Post and then hit Other Button, the other Button acts like Post button. But then when the user hits Other Button again then it works. Same goes for Post button. User have to hit it twice in order to work. How can we fix it
Thanks
0
 
LVL 9

Author Comment

by:syedasimmeesaq
Comment Utility
actually its happening with this $actionValues['Other Button']='test.php?a=edit&recid=' .$_SESSION["recid"];
only.

First time Other Button behaves like Post button and then second time it works..why?
0
Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

 
LVL 82

Expert Comment

by:hielo
Comment Utility
>> the other Button acts like Post button
BOTH buttons are type="submit" so both will actually submit the form. What dictates whether the request should be post or get is the method attribute. I don't know what you are trying to achieve, but both buttons are (CORRECTLY) submitting to the server because they are type=submit. IF anything, you(the programmer) need to determine if you see
$_POST['action']=='Post' and do one thing, but if you see
$_POST['action']=='Other Button' then do something else.
0
 
LVL 82

Expert Comment

by:hielo
Comment Utility
>.First time Other Button behaves like Post button and then second time it works..why?
I think the problem you are seeing is that initially when the form loads, most likely there is no such thing as $_POST['action'] so:

...action="<?php echo $actionValues[ $_POST['action'] ];?>" ...
 

will give you:

...action=""...
 
 

Thus, you need specify a default value at the very least:
 

...

<!-- if I copy another form statement here it makes another new form, which is not what I want -->

<?php

//provide an array that mapst the value of the button to the desired destination

$actionValues=array();

$actionValues['Post']='test.php';

$actionValues['Other Button']='test.php?a=edit&recid=' .$_SESSION["recid"];
 

//specify the default method here

$method=$actionValues['Post'];
 

//now if you see $_POST['action'], override the default value

if( isset($_POST['action']) )

{

 $method=$_POST['action'];

}

?>

 

<form enctype="multipart/form-data" action="<?php echo $method; ?>" method="post">

<input type="hidden" name="sql" value="update">

<input type="hidden" name="xID" value="<?php echo $row["ID"] ?>">

<?php showroweditor($row, true); ?>

<p><input type="submit" name="action" value="Post"></p>

<p><input type="submit" name="action" value="Other Button"></p>

</form>

...

Open in new window

0
 
LVL 9

Author Comment

by:syedasimmeesaq
Comment Utility
I tried that but now both of them work same as this one
$actionValues['Post']='test.php';
I think I am not understanding it right
0
 
LVL 9

Author Comment

by:syedasimmeesaq
Comment Utility
I did a simplified version of what you said above just to see if it works or not, I still have to hit exit button twice.
<?php
$lurl = "";
if($_POST["action"] =="exit")
{
$lurl = "test.php";
}
if ($_POST["action"] =="save")
{
$lurl = "test.php?a=edit&recid=$recid";
}


 ?>
<form enctype="multipart/form-data" action="<?php echo $lurl; ?>" method="post">
<input type="hidden" name="sql" value="update">
<input type="hidden" name="xID" value="<?php echo $row["ID"] ?>">

<?php showroweditor($row, true); ?>
<p><input type="submit" name="action" value="Post"><input type="submit" name="action" value="exit"><br>
<?php echo $recid; ?>


not sure why is it happening
0
 
LVL 9

Author Comment

by:syedasimmeesaq
Comment Utility
when first time the page loads and I hove my mouse over the buttons, I see both of the buttons value in the bottom same..thats the reason its happening. They both have this value
test.php?a=edit&recid=$recid
but if I hit exit once and then hover the mouse then the values are different. I know the problem now but I don't know why is it happening and how can I fix it
Thanks
0
 
LVL 82

Accepted Solution

by:
hielo earned 500 total points
Comment Utility
On that simplied page, when you type the url to your page directly on the browser's address bar, you are NOT submitting anything so both of your if conditions will evaluate to false. Hence $url will remain an empty string. So initially, when the page loads for the first time, if you look at the browser's source code you should see:
<form enctype="multipart/form-data" action="" method="post">

Since action is blank, the browser will submit the request back to the same page. Once you submit once, THEN one of your if clauses will be true and on the next click you go to one of the desired pages.
0
 
LVL 9

Author Comment

by:syedasimmeesaq
Comment Utility
ok heilo I figured it out. I redirected them after updating. So I did this



function sql_update()
{
  global $conn;
  global $_POST;
 
  $sql = "update `test` set ID=" .sqlvalue(@$_POST["ID"], false) ." where " .primarykeycondition();
  mysql_query($sql, $conn) or die(mysql_error());
if($_post['action']=="exit")
{
header("location: test.php");
exit;
}
}


and that seemed to work. Thanks !
0

Featured Post

What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

Join & Write a Comment

Consider the following scenario: You are working on a website and make something great - something that lets the server work with information submitted by your users. This could be anything, from a simple guestbook to a e-Money solution. But what…
This article discusses how to create an extensible mechanism for linked drop downs.
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…

743 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now