2011-08-03 65 views
1

錯誤:*解析錯誤:語法錯誤,在第9行意外T_VARIABLE * < - 仍然給了我同樣的錯誤..錯誤的PDO聲明

PHP

<?php 
#connect mysql 
require_once "dbcred.php"; 
$dbh = testdb_connect(); 

session_start(); 
$username = $_POST['regduser']; 
$userpass = md5($_POST['regdpass']); 
$sql = $pdo->prepare("SELECT * from Students WHERE regduser=:username and regdpass=:pass"); 
$sql->bindParam(':username', $username) 
$sql->bindParam(':pass', $userpass) 
$sql->execute(); 
$result = mysql_query($sql); 
if (mysql_num_rows($result)!= 1) { 
$error = "Login failed"; 
#include "loginform.php"; 
} else { 
    echo "<h1>exists</h1>"; 
#$_SESSION['regduser'] = "$username"; 
#$_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
// any other data needed to navigate the site or 
// to authenticate the user can be added here 
#include "membersection.php"; 
} 

?> 

dbcred.php

<?php 
    # pdo_testdb_connect.php - function for connecting to the "test" database 

    function testdb_connect() 
    { 
    $dbh = new PDO("mysql:host=localhost;dbname=#", "root", ""); 
    return ($dbh); 
    } 
?> 

HTML:

<form action="inc/check_regUsr.php" method="post" id="userLogon"> 
    <div class="field required"> 
     Username: <input type="text" name="regduser" tabindex="1" /><br /> 
     </div> 
     <div class="field required"> 
     Password: <input type="text" name="regdpass" tabindex="2" /><br /> 
     </div> 
     <input type="submit" name="submitUser" /> 
</form> 

回答

5
$sql = $dbh->prepare("SELECT * from Students WHERE regduser=:username and regdpass=:pass"); 
$sql->bindParam(':username', $username) 
$sql->bindParam(':pass', $userpass) 
$sql->execute(); 

Bobby-Tables PHP

如果您已經使用PDO,則使用參數化查詢來利用轉義。 此外,您在查詢中使用單引號並將字符串括起來。在查詢中對字符串和單引號使用雙引號,因爲它現在是這樣的,你已經在第一個單引號之後終止了字符串。

+0

請參閱更新的第一代碼塊,它仍然給我同樣的錯誤。 – Jshee

+0

@ user700070已更新。 – Jacob

2

你需要把字符串連接語法查詢(週期):

$sql = $pdo->prepare('SELECT * from Students WHERE regduser="'.addslashes($username).'" and regdpass="'.addslashes($userpass).'"'); 

您也可以使用雙引號爲您的字符串,這意味着變量將在字符串中被替換。

$username = addslashes($username); 
$sql = $pdo->prepare("SELECT * from Students WHERE regduser='$username' and regdpass='$userpass'"); 

我逃脫了你的變量太多,你需要確保你總是從用戶逃離的數據是在查詢中使用之前,或使用PDO來交換他們與問號(?)

+0

他已經在使用PDO準備。他不應該使用bindValue方法來設置值而不是將它們添加到查詢並轉義它們? – Dan

+0

@cularis的選項是一個更好的方法來做到這一點 – phindmarsh

+0

@丹,正確的是。我已經更新了我的答案,但cularis有更好的解釋。 – phindmarsh

0

您的字符串結構被打破:

$sql = $pdo->prepare('SELECT * from Students WHERE regduser='$username' and regdpass='$userpass''); 
        ^--start string      ^---end string 

試試這個:

$sql = $pdo->prepare("SELECT * from Students WHERE regduser='$username' and regdpass='$userpass'"); 
        ^--double quote               ^---ditto 
1

您需要將該字符串放在雙引號中。 PHP認爲該語句在第二個單引號字符處終止。 (「SELECT * from Students WHERE regduser ='$ username'and regdpass ='$ userpass'」);};

1

您以錯誤的方式使用字符串連接。 9號線應該是這樣的:

$sql = $pdo->prepare("SELECT * from Students WHERE regduser='$username' and regdpass='$userpass'"); 

或此,如果你想使用單引號:

$sql = $pdo->prepare('SELECT * from Students WHERE regduser=\''.$username.'\' and regdpass=\''.$userpass.'\'");