I wrote a script in PHP that works fine on its own, but when inserted into a document containing CSS does not work properly. I am a newb with the PHP programming, and what I am trying to do is create a simple register/login script. Once the user has successfully logged in I used the "header" command to redirect them to the rest of the site. I tested the code in the page with CSS and the header command did not work. I also placed the code in a blank document and upon successful login It did work. Does anyone know if the CSS is what is causing the problem here? Also, the code placed in the non-css document was copied directly from the css document, and the extensions for both is .php.

The header function must be used before any output is printed, i.e before the opening HTML tag, make sure there is no HTML code or echo/print functions before the header one.

There is nothing like that before the header function. As I said, the same exact code works on one page, but not on the one with the CSS layout. I am also using Dreamweaver CS3 if that helps.

Are you adding the PHP code to the top of the HTML/CSS file or using an include function? Can you post the code here?

It is running at the top of the document. I withheld all of the sql connection code because its a pain to hand copy it all ( i'm running the code on a separate machine than the one connected to the internet...).

Here is the code in a nutshell

<?php

sql connection stuff...

$username = $_POST;
$password = $_POST;

if($_POST)
{
$loginresults = mysql_query("SELECT *FROM registrations WHERE username = '$username' AND password = '$password' ")
or die (mysql_error());

$login_check = mysql_num_rows($loginresults);

if($login_check>0)
{
header('Location:http://localhost/portfolio.php');
}
}

There doesnt seem to be a problem with the code, but for the header function, try to use a relative link and not http://localhost:

header('Location:./portfolio.php');

On the page that it is not working is the PHP code on there or is it in a seperate file. Also, does the script return an error such as 'Headers already sent by...'?

The PHP is on the page, not on a separate file. It also returns no errors, but that may be because it returns them underneath the CSS tables if it does.

Have a look at the source code through your browser to see if there are any errors hidden beneath tables/elements.

If there are not add something similar to the following to see if the SQL query is causing an issue:

if($login_check>0) {
  header('Location:./portfolio.php');
} else {
  echo 'Login Failed';
}

After creating yet another test page, this time with 3 simple html tables, it also does not work. I am now convinced that it is the tables that is botching my code.

So long as the PHP code comes before anything else in the file, the HTML/CSS should not effect it. If there is any HTML before the PHP then the headers are sent and cannot be modified with the header function.

Can you post the entire source here in [ /CODE] tags?[CODE ] [ /CODE] tags?

Have a look at the source code through your browser to see if there are any errors hidden beneath tables/elements.

If there are not add something similar to the following to see if the SQL query is causing an issue:

if($login_check>0) {
  header('Location:./portfolio.php');
} else {
  echo 'Login Failed';
}

Initially that was what I did the first time around, the only problem is that the echo statment echos under my tables and I cannot see it. I just put the echo statement in the else function and checked the source, and still got nothing.

Here is the entire source for the page in question.

<?php

$dbhost = 'localhost';
$dbusername = 'xylude';
$dbpassword = '';
$database_name = 'portfolio';


$connection = mysql_pconnect("$dbhost", "$dbusername", "$dbpassword")
	or die ("Could not connect to database");
	
$db = mysql_select_db("$database_name", $connection)
	or die ("Could not find database");
	
	


$username = $_POST['usern'];
$password = $_POST['pass'];


if($_POST['submit'])
{
$loginresults = mysql_query("SELECT * FROM registrations WHERE username = '$username' AND password = '$password' ") or die(mysql_error());

	$login_check = mysql_num_rows($loginresults);

if($login_check>0)
{
header( 'Location:./portfolio.php');
}
else
{
echo "Login Failed";
}


}





?>









<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<style type="text/css"> 
<!-- 
body  {
	font: 100% Verdana, Arial, Helvetica, sans-serif;
	background: #666666;
	margin: 0; /* it's good practice to zero the margin and padding of the body element to account for differing browser defaults */
	padding: 0;
	text-align: center; /* this centers the container in IE 5* browsers. The text is then set to the left aligned default in the #container selector */
	color: #000000;
}

/* Tips for Elastic layouts 
1. Since the elastic layouts overall sizing is based on the user's default fonts size, they are more unpredictable. Used correctly, they are also more accessible for those that need larger fonts size since the line length remains proportionate.
2. Sizing of divs in this layout are based on the 100% font size in the body element. If you decrease the text size overall by using a font-size: 80% on the body element or the #container, remember that the entire layout will downsize proportionately. You may want to increase the widths of the various divs to compensate for this.
3. If font sizing is changed in differing amounts on each div instead of on the overall design (ie: #sidebar1 is given a 70% font size and #mainContent is given an 85% font size), this will proportionately change each of the divs overall size. You may want to adjust based on your final font sizing.
*/
.twoColElsLtHdr #container { 
	width: 46em;  /* this width will create a container that will fit in an 800px browser window if text is left at browser default font sizes */
	background: #FFFFFF;
	margin: 0 auto; /* the auto margins (in conjunction with a width) center the page */
	border: 1px solid #000000;
	text-align: left; /* this overrides the text-align: center on the body element. */
} 
.twoColElsLtHdr #header {
	padding: 0 10px;  /* this padding matches the left alignment of the elements in the divs that appear beneath it. If an image is used in the #header instead of text, you may want to remove the padding. */
	background: black;
} 
.twoColElsLtHdr #header h1 {
	margin: 0; /* zeroing the margin of the last element in the #header div will avoid margin collapse - an unexplainable space between divs. If the div has a border around it, this is not necessary as that also avoids the margin collapse */
	padding: 10px 0; /* using padding instead of margin will allow you to keep the element away from the edges of the div */
}

/* Tips for sidebar1:
1. Be aware that if you set a font-size value on this div, the overall width of the div will be adjusted accordingly.
2. Since we are working in ems, it's best not to use padding on the sidebar itself. It will be added to the width for standards compliant browsers creating an unknown actual width. 
3. Space between the side of the div and the elements within it can be created by placing a left and right margin on those elements as seen in the ".twoColElsLtHdr #sidebar1 p" rule.
*/
.twoColElsLtHdr #sidebar1 {
	float: left; 
	width: 12em; /* since this element is floated, a width must be given */
	background: #EBEBEB; /* the background color will be displayed for the length of the content in the column, but no further */
	padding: 15px 0; /* top and bottom padding create visual space within this div */
}
.twoColElsLtHdr #sidebar1 h3, .twoColElsLtHdr #sidebar1 p {
	margin-left: 10px; /* the left and right margin should be given to every element that will be placed in the side columns */
	margin-right: 10px;
	background: grey;
}

/* Tips for mainContent:
1. If you give this #mainContent div a font-size value different than the #sidebar1 div, the margins of the #mainContent div will be based on its font-size and the width of the #sidebar1 div will be based on its font-size. You may wish to adjust the values of these divs.
2. The space between the mainContent and sidebar1 is created with the left margin on the mainContent div.  No matter how much content the sidebar1 div contains, the column space will remain. You can remove this left margin if you want the #mainContent div's text to fill the #sidebar1 space when the content in #sidebar1 ends.
3. To avoid float drop, you may need to test to determine the approximate maximum image/element size since this layout is based on the user's font sizing combined with the values you set. However, if the user has their browser font size set lower than normal, less space will be available in the #mainContent div than you may see on testing.
4. In the Internet Explorer Conditional Comment below, the zoom property is used to give the mainContent "hasLayout." This avoids several IE-specific bugs that may occur.
*/
.twoColElsLtHdr #mainContent {
	margin: 0 1.5em 0 13em; /* the right margin can be given in ems or pixels. It creates the space down the right side of the page. */
} 
.twoColElsLtHdr #footer {
	padding: 0 10px; /* this padding matches the left alignment of the elements in the divs that appear above it. */
	background:black;
} 
.twoColElsLtHdr #footer p {
	margin: 0; /* zeroing the margins of the first element in the footer will avoid the possibility of margin collapse - a space between divs */
	padding: 10px 0; /* padding on this element will create space, just as the the margin would have, without the margin collapse issue */
}

/* Miscellaneous classes for reuse */
.fltrt { /* this class can be used to float an element right in your page. The floated element must precede the element it should be next to on the page. */
	float: right;
	margin-left: 8px;
}
.fltlft { /* this class can be used to float an element left in your page */
	float: left;
	margin-right: 8px;
}
.clearfloat { /* this class should be placed on a div or break element and should be the final element before the close of a container that should fully contain a float */
	clear:both;
    height:0;
    font-size: 1px;
    line-height: 0px;
}
.style1 {color: #FFFFFF}
--> 
</style><!--[if IE]>
<style type="text/css"> 
/* place css fixes for all versions of IE in this conditional comment */
.twoColElsLtHdr #sidebar1 { padding-top: 30px; }
.twoColElsLtHdr #mainContent { zoom: 1; padding-top: 15px; }
/* the above proprietary zoom property gives IE the hasLayout it needs to avoid several bugs */
</style>
<![endif]--></head>

<body class="twoColElsLtHdr">

<div id="container">
  <div id="header">
    <h1 class="style1">Welcome!</h1>
    <!-- end #header --></div>
  <div id="sidebar1">
    <h3>Please Login:</h3>
    <form id="form1" name="form1" method="post" action="">
      <table width="200" border="0">
        <tr>
          <td width="82">Username</td>
          <td width="108"><label>
            <input type="text" name="usern" id="usern" />
          </label></td>
        </tr>
        <tr>
          <td>Password</td>
          <td><label>
            <input type="text" name="pass" id="pass" />
          </label></td>
        </tr>
        <tr>
          <td><label>
            <input type="submit" name="button" id="button" value="Submit" />
          </label></td>
          <td>&nbsp;</td>
        </tr>
      </table>
        </form>
    <p>
      <!-- end #sidebar1 -->
</p>
    </div>
  <div id="mainContent">
    <h1>Jason Crider</h1>
    <p>Hello, I am a 26 year old  Web Designer/Graphic Artist. I am currently attending classes at North Central State College. I am skilled with:</p>
    <p>•Adobe Photoshop<br />
    •Adobe  Dreamweaver<br />
    •Adobe Flash<br />
    •Adobe InDesign/Illustrator</p>
    <p>I also have basic skills in PHP/MySQL, JavaScript, HTML, 
      <!-- end #mainContent -->
    and CSS Layouts. Please login or <a href="registerportfolio.php">register</a> to see my portfolio.</p>
  </div>
	<!-- This clearing element should immediately follow the #mainContent div in order to force the #container div to contain all child floats --><br class="clearfloat" />
   <div id="footer">
    <p align="center" class="style1">Copywright 2008 Jason Crider</p>
    <!-- end #footer --></div>
<!-- end #container --></div>
</body>
</html>

You should change

if($_POST['submit'])

to

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

OR


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

Also, I would remove the $db = from the select db function as it is not needed here.

Haha, that did it! Thanks very much for the help!

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.