簡體   English   中英

PHP和SQL查詢失敗

[英]php and sql query failing

我有這個代碼

http://www.nomorepasting.com/getpaste.php?pasteid=22580

這是小型ajax應用程序的一部分。 我想知道一種分配$ query的更好,更有效的方法,而不是每次使用不同的查詢或if子句來復制sql。 基本上,查詢將取決於單擊的鏈接,但是我不確定如何在邏輯中顯示該鏈接。 我也不確定為什么$ result中的SQL查詢失敗。

更新 :我將Eran的功能集成到重構的代碼中。 注意:我通過將$ table變量傳遞給它來對其進行了更正,並對其進行了重命名,因為它不僅搜索查詢文本,而且主要返回所需的行!

主要錯誤

  • 錯誤1:在所有情況下,您都用query2覆蓋查詢,這會破壞代碼。
  • 錯誤2:LIKE'%$ query%'LIKE和'=> LIKE'%之間缺少空格...這很可能也會破壞您的代碼

其他事宜

  • 安全問題:SQL注入危險,請使用mysql_real_escape_string
  • \\ n不是平台無關的:使用PHP_EOL
  • 短if塊的替代寫法
  • 對於普通if結構和所有此類結構,請使用大括號

這是您的代碼,進行了一些更改,請查看注釋

<?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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM