[英]php and sql query failing
我有這個代碼
http://www.nomorepasting.com/getpaste.php?pasteid=22580
這是小型ajax應用程序的一部分。 我想知道一種分配$ query的更好,更有效的方法,而不是每次使用不同的查詢或if子句來復制sql。 基本上,查詢將取決於單擊的鏈接,但是我不確定如何在邏輯中顯示該鏈接。 我也不確定為什么$ result中的SQL查詢失敗。
更新 :我將Eran的功能集成到重構的代碼中。 注意:我通過將$ table變量傳遞給它來對其進行了更正,並對其進行了重命名,因為它不僅搜索查詢文本,而且主要返回所需的行!
主要錯誤 :
其他事宜
這是您的代碼,進行了一些更改,請查看注釋 :
<?php
session_start(); //ommit, no session var used
//use braces, always!
//you may write such statements with the short form like
if (isset($_GET['cmd'])) : $cmd = $_GET['cmd']; else : die (_MSG_NO_PARAM); endif;
$query = '';
//escpae your input - very important for security! sql injection!
if ( isset ($_GET["query"]))
{
$query = mysql_real_escape_string($_GET["query"]);
}
//no need for the other part you had here
$con = mysql_connect("localhost", "root", "geheim");
if (!$con) : die ('Connection failed. Error: '.mysql_error()); endif;
mysql_select_db("ebay", $con);
if ($cmd == "GetRecordSet")
{
$table = 'Auctions';
$rows = getRowsByArticleSearch($searchString, $table);
//use PHP_EOL instead of \n in order to make your script more portable
echo "<h1>Table: {$table}</h1>".PHP_EOL;
echo "<table border='1' width='100%'><tr>".PHP_EOL;
echo "<td width='33%'>Seller ID</td>".PHP_EOL;
echo "<td width='33%'>Start Date</td>".PHP_EOL;
echo "<td width='33%'>Description</td>".PHP_EOL;
echo "</tr>\n";
// printing table rows
foreach ($rows as $row)
{
$pk = $row['ARTICLE_NO'];
echo '<tr>'.PHP_EOL;
echo '<td><a href="#" onclick="GetAuctionData(\''.$pk.'\')">'.$row['USERNAME'].'</a></td>'.PHP_EOL;
echo '<td><a href="#" onclick="GetAuctionData(\''.$pk.'\')">'.$row['ACCESSSTARTS'].'</a></td>'.PHP_EOL;
echo '<td><a href="#" onclick="GetAuctionData(\''.$pk.'\')">'.$row['ARTICLE_NAME'].'</a></td>'.PHP_EOL;
echo '</tr>'.PHP_EOL;
}
}
mysql_free_result($result);
//mysql_close($con); no need to close connection, you better don't
function getRowsByArticleSearch($searchString, $table)
{
$searchString = mysql_real_escape_string($searchString);
$result = mysql_query("SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME FROM {$table} WHERE upper ARTICLE_NAME LIKE '%" . $searchString . "%'");
if($result === false) {
return mysql_error();
}
$rows = array();
while($row = mysql_fetch_assoc($result)) {
$rows[] = $row;
}
return $rows;
}
// ?> ommit closing php tag
"SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME
FROM {$table} WHERE upper ARTICLE_NAME LIKE'%$query%'"
您需要在upper
函數的參數周圍加上方括號。 將您的查詢更改為此,它應該可以工作:
"SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME
FROM {$table} WHERE upper(ARTICLE_NAME) LIKE'%$query%'"
用於功能:
$result = mysql_query($sql_query) or die(mysql_error());
看看你得到什么樣的mysql錯誤。
你應該做尼克夫說的。
而且您肯定很容易使用SQL注入:
Wikibooks: http : //en.wikibooks.org/wiki/Programming :PHP: SQL_Injection長篇文章: http : //www.securiteam.com/securityreviews/5DP0N1P76E.html
您可以使用接受搜索文本作為參數的函數來抽象查詢。 就像是:
function searchQuery($text) {
$text = mysql_real_escape_string($text);
$result = mysql_query("SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME FROM {$table} WHERE upper ARTICLE_NAME LIKE '%" . $text . "%'");
if($result === false) {
return mysql_error();
}
$rows = array();
while($row = mysql_fetch_assoc($result)) {
$rows[] = $row;
}
return $rows;
}
請注意,您應該轉義用戶輸入以防止SQL注入攻擊(在這里,我使用mysql_real_escape_string()來做到這一點)。 如果查詢失敗,此函數還會返回錯誤代碼,因此您應檢查結果以查看其是否為數組:
$result = searchQuery($_GET['query']);
if(!is_array($result) ) {
echo 'An error has occurred:' . $result;
} else {
//iterate over rows
}
用大括號{包裹邏輯結構(IF / ELSE)。 它具有更好的可讀性,有助於避免不必要的錯誤。
您沒有以誇張的方式將語句包含在IF / THEN / ELSE構造中,因此只有每個塊中的第一個語句才有條件執行,其余的始終執行。
在大多數情況下,您可能會為$ query分配$ query2,而可能尚未定義$ query2。
另一個提示:清理您的輸入,不要像這樣將用戶輸入粘貼到SQL中,這很危險。
您可能需要在LIKE和'%$ query%'之間留一個空格。 另外,您應該研究mysql_error()函數-讓MySQL確切告訴您錯誤是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.