2013-03-12 25 views
0

我有,我有一個主要形式,列出使用此代碼PHP聯表單中使用ID

<?php 
$con = mysql_connect("localhost","root",""); 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 
mysql_select_db("datatest", $con); 
$result = mysql_query("SELECT * FROM Personnel"); 
echo "<TABLE BORDER=2>"; 
echo"<TR><TD><B>Name</B><TD><B>Number</B><TD><B>View</B><TD></TR>"; 
while ($myrow = mysql_fetch_array($result)) 
{ 
echo "<TR><TD>".$myrow["Surname"]." ".$myrow["First Names"]."<TD>".$myrow["Number"]; 
echo "<TD><a href=\"childdetails.php?EmployeeID=".$myrow["EmployeeID"]."\">View</a>"; 
} 
echo "</TABLE>"; 
?> 
</HTML> 

所有人員數據庫,你可以注意到我有一個鏈接可以查看的人,但是當細節我點擊VIEW鏈接出現以下錯誤

解析錯誤:語法錯誤,意外的'EmployeeID'(T_STRING)在C:\ Program Files \ EasyPHP-12.1 \ www \ my portable files \ dss4 \ childdetails.php中在線6 childdetails.php有以下代碼

<HTML> 
<?php 
$db = mysql_connect("localhost", "root", ""); 
mysql_select_db("datatest",$db); 
$result = mysql_query("SELECT * FROM children; 
WHERE "EmployeeID="["$EmployeeID"],$db); 
$myrow = mysql_fetch_array($result); 
echo "Child Name: ".$myrow["ChildName"]; 
echo "<br>Mother: ".$myrow["Mother"]; 
echo "<br>Date of Birth: ".$myrow["DateOfBirth"]; 
?> 
</HTML> 

由於列出人事工作的第一種形式,我認爲問題出現在服務器返回的第6行的childdetails.php中,但我根本不知道如何解決。

注:一個人可以有一個以上的孩子,以及有一個以上的妻子 請幫助

+0

您在生成的SQL語句中使用雙引號,並且對字符串進行分隔。 – andrewsi 2013-03-12 03:00:46

+0

[**請不要在新代碼中使用'mysql_ *'函數**](http://bit.ly/phpmsql)。他們不再被維護[並且被正式棄用](http://j.mp/XqV7Lp)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。 – Kermit 2013-03-12 03:00:51

+1

你在'WHERE'之前有一個分號';' – Nabab 2013-03-12 03:20:45

回答

0

您 需要 改變你的查詢是這樣的

<HTML> 
<?php 
$db = mysql_connect("localhost", "root", ""); 
mysql_select_db("datatest",$db); 
$result = mysql_query("SELECT * FROM children WHERE EmployeeID=" . $EmployeeID, $db); 
$myrow = mysql_fetch_array($result); 
echo "Child Name: ".$myrow["ChildName"]; 
echo "<br>Mother: ".$myrow["Mother"]; 
echo "<br>Date of Birth: ".$myrow["DateOfBirth"]; 
?> 
</HTML> 
+0

請不要教人們避免使用準備好的語句,這是一個免費的所有SQL注入。 – Jonast92 2013-03-12 03:17:16

+0

奇怪,這也不起作用 – user2159175 2013-03-12 15:41:44

+0

現在試試這個。但請記住,告訴我們@ Jonast92你需要準備好你的語句 – 2013-03-12 21:10:18

0

我會說更多喜歡。

$result = mysql_query("SELECT * FROM children WHERE EmployeeID='$EmployeeID'"); 
// as far $EmployeeID is actualy set before running a query 
//but as comment says don't use mysql better something like this 

<?php 
$mysqli = new mysqli('localhost', 'root', 'my_password', 'my_db'); 
if ($mysqli->connect_error) { 
    die('Connect Error (' . $mysqli->connect_errno . ') ' 
     . $mysqli->connect_error); 
} 
/* create a prepared statement */ 
if ($stmt = $mysqli->prepare("SELECT * FROM children WHERE EmployeeID=?")) { 

/* bind parameters for markers */ 
$stmt->bind_param("s", $EmployeeID); 

/* execute query */ 
$stmt->execute(); 

/* bind result variables */ 
$stmt->bind_result($Employee); 

/* fetch value */ 
$stmt->fetch(); 

printf($Employee); 

/* close statement */ 
$stmt->close(); 
} 
/* close connection */ 
$mysqli->close(); 
+0

請不要教人們避免使用預準備語句,這是一個免費的所有SQL注入。 – Jonast92 2013-03-12 03:17:41

+0

是的,你的權利 – 2013-03-12 03:23:34

+0

仍然可能比他首先做的更好。 – Jonast92 2013-03-12 03:33:05

0

首先,你的查詢是錯誤的,你告訴sql你的腳本已經結束,它應該開始執行一些新的事情。下面我會告訴你如何正確地做到這一點。

另外,不要使用mysql的特定語法,它已經過時了,並且可能會在以後遇到麻煩,特別是如果您決定使用sqlite或postgresql。

此外,學會使用準備好的語句來避免sql注入,你希望變量被用作字符串到準備好的查詢中,而不是作爲sql的可能執行腳本。

使用PDO連接,您可以初始化一個這樣的:

// Usage: $db = connectToDatabase($dbHost, $dbName, $dbUsername, $dbPassword); 
// Pre:  $dbHost is the database hostname, 
//   $dbName is the name of the database itself, 
//   $dbUsername is the username to access the database, 
//   $dbPassword is the password for the user of the database. 
// Post: $db is an PDO connection to the database, based on the input parameters. 
function connectToDatabase($dbHost, $dbName, $dbUsername, $dbPassword) 
{ 
    try 
    { 
     return new PDO("mysql:host=$dbHost;dbname=$dbName;charset=UTF-8", $dbUsername, $dbPassword); 
    } 
    catch(PDOException $PDOexception) 
    { 
     exit("<p>An error ocurred: Can't connect to database. </p><p>More preciesly: ". $PDOexception->getMessage(). "</p>"); 
    } 
} 

然後初始化變量:

$host = 'localhost'; 
$user = 'root'; 
$dataBaseName = 'databaseName'; 
$pass = ''; 

現在,您可以通過訪問您的數據庫

​​

現在您應該構建一個可以用作準備查詢的查詢,也就是說,它接受準備好的語句

$query = "SELECT * FROM children WHERE EmployeeID = :employeeID;"; // Construct the query, making it accept a prepared variable. 
$statement = $db->prepare($query); // Prepare the query. 
$statement->execute(array(':employeeID' => $EmployeeID)); // Here you insert the variable, by executing it 'into' the prepared query. 
$statement->setFetchMode(PDO::FETCH_ASSOC); // Set the fetch mode. 

while ($row = $statement->fetch()) 
{ 
    $ChildName = $row['ChildName']; 
    $Mother = $row['Mother']; 
    $DateOfBirth = $row['DateOfBirth']; 
    echo "Child Name: $ChildName"; 
    echo "<br />Mother: $Mother"; 
    echo "<br />Date of Birth: $DateOfBirth"; 
} 

你應該使用類似的方法來獲得$僱員:你準備查詢,然後你執行的是要付諸執行到查詢數組變量,並避免在此期間SQL注入Ø但這應該會對你有很大的幫助。順便說一下:記住用空白符''''和像我向你展示的一個前向符號來關閉你的break標籤。

+0

非常感謝。我真的不想要SQL注入。現在的問題是,我是一個\新手到PHP和SQL(我無意中將我的MS Access數據庫遷移到SQL和自我教學並不容易,我已經說過,所以你會明白我的問題。似乎它需要在3個獨立的php文件中?對吧? – user2159175 2013-03-12 10:39:42

+0

它不必,它是可選的:)另外,最好花更多的時間來學習最常用和最安全的做法,並最終,最簡單。 – Jonast92 2013-03-12 13:37:44

+0

其實我的意思是,該ID不希望有人sql注入我的數據庫,所以我需要切換到您的選項。我首先想到,如果你在登錄腳本中防止sql注入,那麼你很好,但我看到情況並非如此。 – user2159175 2013-03-12 15:40:42