ปัญหาเกี่ยวกับ session เมื่อลองทำ ajax login

สำหรับผู้ที่ เริ่มต้น Programming - PHP มีอะไร แนะนำ หรือข้อสงสัยต้องบอร์ด นี้ คนที่มีความรู้ แบ่งปันคนอื่นบ้างนะ ปัญหาการเขียนโปรแกรม แบบ OOP Session Cookies php network

Moderators: mindphp, ผู้ดูแลกระดาน

jzany
PHP Newbie
PHP Newbie
Posts: 6
Joined: 27/04/2009 1:05 pm

ปัญหาเกี่ยวกับ session เมื่อลองทำ ajax login

Post by jzany » 27/04/2009 1:15 pm

ผมลองทำ ajaxlogin ตามแบบของกระทู้นี้
http://www.narisa.com/forums/index.php?showtopic=25971
ก็โอเคนะ

แต่ว่าทดลองดัดแปลง ไปใช้ class สำหรับ connect database ที่ตัวผมเองมีอยู่แล้ว
ก็ปรากฏว่ามีปัญหา error ดังนี้
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at I:\www\cityblog\blog\lib\query.class.php:1) in I:\www\cityblog\login_check.php on line 14
ซึ่งปกติ แล้ว ถ้าใช้ งาน class เหล่านี้ ก็ปกติ ดีนะคับ
แต่นี่ผมยังไม่ทันเรียกใช้เลยแค่ include มาก็ error ซะแล้วครับ
ผมคิดว่า ติดปัญหาตรงการ include นี่แหล่ะ ซึ่งผมไม่รู้ว่าเป็นเพราะอะไร


login_check.php
<?
include "./blog/lib/config.inc.php" ;
include "./blog/lib/query.class.php" ;
include "./blog/lib/account.class.php" ;


$username= $_POST['username'];
$password_login = $_POST['password'];

// การใช้งานฐานข้อมูล MySQL
$hostname = "localhost"; //ชื่อฐานข้อมูล
$user = "root"; //รหัสผู้ใช้
$password = "1234"; //รหัสผ่าน
$dbname = "cityblog"; //ชื่อฐานข้อมูล
$tblname = "blog_account"; //ชื่อตาราง
session_start();
session_register("ACCOUNT");
// การติดต่อฐานข้อมูล MySQL
mysql_connect($hostname, $user, $password) or die("ติดต่อกับฐานข้อมูล Mysql ไม่ได้ ");
// เชื่อต่อฐานข้อมูล
mysql_select_db($dbname) or die("เลือกฐานข้อมูลไม่ได้");
// เลือกฐานข้อมูล

$charset = "SET character_set_results=utf8";
mysql_query($charset) or die('Invalid query: ' . mysql_error());
$cs1 = "SET character_set_results=utf8";
mysql_query($cs1) or die('Error query: ' . mysql_error());
$cs2 = "SET character_set_client = utf8";
mysql_query($cs2) or die('Error query: ' . mysql_error());
$cs3 = "SET character_set_connection = utf8";
mysql_query($cs3) or die('Error query: ' . mysql_error());


$sql = "select * from $tblname where username='$username' and password='$password_login'";

$dbquery = mysql_db_query($dbname, $sql);

$num_rows = mysql_num_rows($dbquery);
if($num_rows==1){
print ('OK');
}else {
print ('Fail');
}
?>
ajaxtest.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<Title> LOGIN</Title>
<style type="text/css">
<!--
body,td,th {
font-family: MS Sans Serif, Microsoft Sans Serif, Tahoma;
font-size: 10pt;
}
-->
</style>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

</HEAD>

<BODY>
<? include("ajaxlogintest.php");?>

</BODY>
</HTML>
ajaxlogintest.php
<script language="javascript" src="./blog/js/prototype.js"></script>
<script LANGUAGE="JavaScript">
<!--
Event.observe(window, 'load', function() {
Event.observe('loginForm', 'submit', handleSubmit);
});
function handleSubmit(evt) {
Event.stop(evt);
var url="login_check.php";
//var url="login_check.php";
var data=Form.serialize("loginForm");
var myAjax = new Ajax.Request(
url,
{method: 'post', parameters: data, onSuccess: function(resp) {$('showtext').update(resp.responseText+"<br>");}}
);
//document.commentForm.ctext.value="";
}
//-->
</SCRIPT>

<FORM id="loginForm" METHOD=POST ACTION="">
<div id="showtext"></div>
<TABLE>
<TR>
<TD>User</TD>
<TD><INPUT TYPE="text" NAME="username"></TD>
</TR>
<TR>
<TD>Password</TD>
<TD><INPUT TYPE="password" NAME="password"></TD>
</TR>
<TR>
<TD></TD>
<input type="submit" name="Button" value="เพิ่ม" >
</TR>
</TABLE>
</FORM>

ตัวอย่างไฟล์ config.inc.php
<?

$HOST='localhost';

#$USERNAME='itgserve'; $PASSWORD='440201'; $DBNAME='itgserve_db';
#$USERNAME='root'; $PASSWORD=''; $DBNAME='cityblog';
$USERNAME='root'; $PASSWORD='1234'; $DBNAME='cityblog';


# PreDefineTable --------------------------------------------------------------------------------
$tablePrefix = '';
$tbl_Account = 'account';
$tbl_Content = 'contents';
$tbl_Category = 'categories';
$tbl_Weblink = 'weblink';
$tbl_ContentSubject = 'contents_subj';
query.inc.php
<?
require("mysql.class.php");

class Query extends MySql{
var $MysqlObj;
var $QueryStr;
var $QueryStatus=1;


function Query(){
MySql::mysql();
}
function GetData($Table,$Field,$Conditions="",$Other=""){

$this->QueryStr=" SELECT ".$Field." FROM ".$Table;
if ( $Conditions != '' )
$this->QueryStr.=" WHERE ".$Conditions;
if ( $Other != '' )
$this->QueryStr.= " ".$Other;

MySql::SqlQuery($this->QueryStr);

}
account.inc.php
<?
require("error.class.php");
class Account extends Error{
var $UserId;
var $GroupId;
var $Username;
var $Password;
var $UserGroup;
var $UserType;
var $UserStatus;
var $Key;
var $Member_no;
var $Expire;

var $ErrorList = array();

function Account($username,$password){
$this->Username=$username;
$this->Password=$password;
}
function AccountChecking(){

$username = $this->Username;
$password = $this->Password;
$obj = new Query();


jzany
PHP Newbie
PHP Newbie
Posts: 6
Joined: 27/04/2009 1:05 pm

Re: ปัญหาเกี่ยวกับ session เมื่อลองทำ ajax login

Post by jzany » 27/04/2009 2:30 pm

ผมมีความเข้าใจใน session ระดับนึงครับ ผมเข้าใจว่าต้องประกาศไว้บนสุด
โครงสร้างการเขียนของผมเป็นแบบนี้ ครับ
ajaxtest.php ในนี้ include("ajaxlogintest.php"); ซึ่งเป็น form แล้ว js ของ ajax
เมื่อ submit ฟอร์ม ก็จะส่งค่าไปที่ login_check.php เพื่อเช็ค user และถ้าโอเค ก็จะทำให้มัน ประกาศ session ไปด้วยเลย

ซึ่งผมงง เกี่ยวกับ
include "./blog/lib/config.inc.php" ;
include "./blog/lib/query.class.php" ;
include "./blog/lib/account.class.php" ;

เพราะถ้าผมไม่เอา
#include "./blog/lib/query.class.php" ;
#include "./blog/lib/account.class.php" ;
โค้ดก็จะทำงานได้ปกติ ไม่มีปัญหาเรื่อง session


ผมงงว่า ทำไมเมื่อผม include ส่งไฟล์นี้มาแล้ว ทำให้มันฟ้องเหมือนว่า ผมได้เคยมีการประกาศ session ซ้ำซ้อน อ่ะ ทั้งที่ ทั้งสองไฟล์นั้น ไม่ได้ส่ง session_start() เลยนะ

jzany
PHP Newbie
PHP Newbie
Posts: 6
Joined: 27/04/2009 1:05 pm

Re: ปัญหาเกี่ยวกับ session เมื่อลองทำ ajax login

Post by jzany » 27/04/2009 2:35 pm

เหตุผลที่ผมจะต้อง include
include "./blog/lib/query.class.php" ;
include "./blog/lib/account.class.php" ;
สองไฟล์นี้ ด้วยก็เพราะ
ผมต้องการใช้ object ที่ผมเขียนขึ้นเอง เพื่อ connect กับ mysql ครับ
และก็ object เกี่ยวกับการจัดการ account ด้วย
ซึ่งตอนนี้ ผมได้ใช้ mysql_connect(); แบบเดิมแก้ขัด อยู่ครับ

jzany
PHP Newbie
PHP Newbie
Posts: 6
Joined: 27/04/2009 1:05 pm

Re: ปัญหาเกี่ยวกับ session เมื่อลองทำ ajax login

Post by jzany » 27/04/2009 2:51 pm

เหมือนว่าจะเข้าใจเพิ่มมาอีกนิด หลังได้นั่งงมอยู่พักใหญ่ๆ

ผมได้ทดลอง ตัดเอาโค้ดทั้งหมด ใน query.class.php มาแปะ ไว้ที่ login_check.php ครับ
ปรากฏว่าใช้งานได้อ่ะ
ทำไมจึงเป็นเช่นนั้นครับ
ทำไมอ่ะ ผม include ต่อไม่ได้หรอ

รบกวนผู้รู้ ตอบให้หายสงสัยหน่อยนะครับ

User avatar
mindphp
ผู้ดูแลระบบ MindPHP
ผู้ดูแลระบบ MindPHP
Posts: 22235
Joined: 22/09/2008 6:18 pm
Contact:

Re: ปัญหาเกี่ยวกับ session เมื่อลองทำ ajax login

Post by mindphp » 27/04/2009 3:12 pm

jzany wrote:ผมมีความเข้าใจใน session ระดับนึงครับ ผมเข้าใจว่าต้องประกาศไว้บนสุด
โครงสร้างการเขียนของผมเป็นแบบนี้ ครับ
ajaxtest.php ในนี้ include("ajaxlogintest.php"); ซึ่งเป็น form แล้ว js ของ ajax
เมื่อ submit ฟอร์ม ก็จะส่งค่าไปที่ login_check.php เพื่อเช็ค user และถ้าโอเค ก็จะทำให้มัน ประกาศ session ไปด้วยเลย

ซึ่งผมงง เกี่ยวกับ
include "./blog/lib/config.inc.php" ;
include "./blog/lib/query.class.php" ;
include "./blog/lib/account.class.php" ;

เพราะถ้าผมไม่เอา
#include "./blog/lib/query.class.php" ;
#include "./blog/lib/account.class.php" ;
โค้ดก็จะทำงานได้ปกติ ไม่มีปัญหาเรื่อง session


ผมงงว่า ทำไมเมื่อผม include ส่งไฟล์นี้มาแล้ว ทำให้มันฟ้องเหมือนว่า ผมได้เคยมีการประกาศ session ซ้ำซ้อน อ่ะ ทั้งที่ ทั้งสองไฟล์นั้น ไม่ได้ส่ง session_start() เลยนะ
ถ้าเข้าใจว่า ต้องประกาศไว้บนสุด แล้วทำไมไม่ ประกาศ
session_start(); ไว้บนสุดล่ะครับ

session_register("ACCOUNT"); <----- ใส่ไว้เพื่ออะไร
และ session_register() php จะยกเลิกการใช้ function นี้แล้ว ครับ ลองค้นดูในกระทู้เ่ก่าๆ เคยพูดถึง เรื่อง session_register ไว้หลายกระทู้

ส่วนจะใช้ session_start(); ไว้บนสุดนั้น จริงๆมันไม่จำเป็นครับ ถ้าเราใช้ buffer เข้ามาช่วย
และ ถ้า บรรทัดก่อนหน้า ไม่มี ส่วนแสดงผล session_start(); ก็ไม่จำเป็นต้องไว้ บนสุดเช่นกัน

ที่นี้ลองดู ปัญหาไป include ไว้ก่อน session_start(); แล้ว มี waring ก็แสดง ว่า ใน ไฟล์ที่ include เข้ามาใช้ อาจมี อักขระ พิเศษ อยู่ในไฟล์นั้น
ติดตาม VDO: http://www.youtube.com/c/MindphpVideoman
ติดตาม FB: https://www.facebook.com/pages/MindphpC ... 9517401606
หมวดแชร์ความรู้: https://www.mindphp.com/forums/viewforum.php?f=29
รับอบรม และพัฒนาระบบ: https://www.mindphp.com/forums/viewtopic.php?f=6&t=2042

jzany
PHP Newbie
PHP Newbie
Posts: 6
Joined: 27/04/2009 1:05 pm

Re: ปัญหาเกี่ยวกับ session เมื่อลองทำ ajax login

Post by jzany » 27/04/2009 3:39 pm

session_start(); ที่เห็น นี้เป็นโค้ดคนอื่นเอามาทดลองอ่ะครับ เนื่องจากว่า ไม่มีการส่งค่าอะไรให้ browser ก่อน ก็เลยประกาศตรงนั้นได้ ซึ่งถ้าไม่ติดปัญหาของผมก็ใช้งานได้ปกติ อ่ะคับ

session_register("ACCOUNT"); ส่วนอันนี้ ผมทดลอง register อ่ะคับ ต่อไปกำลัง พิจารณา ไปใช้ $_SESSION[''] แบบนี้มั่งคับ

ก็เหลือข้อสุดท้ายที่ผมคิดว่า อาจจะเป็นเพราะ อักขระพิเศษ อ่ะคับ
เพราะ จากที่ได้ทดสอบดูว่าไฟล์ ต่างๆ ของผมว่าเป็น UTF-8 หรือไม่ ก็พบว่า มีไฟล์ query.inc.php ยังไม่เป็นคับ
ผมทดสอบโดยการเปิดด้วย notepad คับ แล้วกด save as... เห็นว่า encoding = ANSI คับ
ผมต้องการทำให้เป็น UTF=8

เคยหาวิธีแก้ปัญหา ไฟล์ UTF-8 แล้วมีปัญหากับ session แล้วเหมือนกันครับ
เขาให้แก้ โดยการเปิดด้วย Editplus แล้วคัดลอกโค้ดทั้งหมดไปที่ไฟล์ใหม่ แล้วเซฟใน editplus ให้เป็น UTF-8
ผมลองแก้ตามนั้นครับแล้วกับไปดูด้วย notepad ก็เป็น UTF-8 หมดแล้ว
แต่ไฟล์ query.inc.php มันไม่ยอมเป็นอ่ะ ยังเป็น ANSI เหมือนเดิม ผมควรทำไงดีัคับ

jzany
PHP Newbie
PHP Newbie
Posts: 6
Joined: 27/04/2009 1:05 pm

Re: ปัญหาเกี่ยวกับ session เมื่อลองทำ ajax login

Post by jzany » 27/04/2009 4:39 pm

โอเคครับแก้ปัญหาได้แล้ว
เป็นที่ อักขระพิเศษในไฟล์ครับ เกี่ยวกับ UTF-8

จากที่ผมงง ว่าทำไม่ยังเห็นใน Notepad ว่าเป็น ANSI นั้น คงเป็นเพราะ Notepad คงมีปัญหากับ UTF-8 ง่ะ
เพราะถ้าเราใช้ notepad เซฟ เป็น UTF-8 มันจะเขียน BOM
(byte order mark) ลงในไฟล์ด้วย

จากที่ผมงงว่า ทำไม ไฟล์ อื่นที่เคยเซฟเป็น utf-8 แล้ว กลับมาดูใน notepad แล้วกด save as... แล้วดู encoding ก็เป็น UTF-8
ต่างจากสองไฟล์ที่ผมสงสัยว่า ทำไม ยังคงเป็น ANSI อยู่ทั้งที่ ก็เซฟเป็น UTF-8 เช่นกัน

ก็ได้ข้อสรุปว่า ถ้าปล่อยให้ บรรทัดสุดท้ายมีบรรทัดว่างอยู่ ก็จะเจอปัญหาาแบบผม

ทีนี้ปัญหาทั้งหมดก็เลยแก้ด้วยการ ยึดเอา Editplus เป็นหลัก เปิดทุกไฟล์ มาคัดลอก แล้ววางในไฟล์ ใหม่แล้วก็ลบบรรทัดว่างๆ ของไฟล์ ออกซะ แล้วก็เซฟ เป็น UTF-8
เท่านี้ ก็จบครับ


ขอบคุณ mindphp ครับที่ยังไงก็ให้ แนวทางในการแก้ไขได้อย่างถูกจุด
:lol:

Post Reply

Return to “Programming - PHP”

Who is online

Users browsing this forum: No registered users and 61 guests