php和sql查询失败

时间:2008-12-09 11:32:06

标签: php sql

我有这段代码

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

是小型ajax应用程序的一部分。我想知道一种更好,更有效的方式来分配$ query,而不是每次使用不同的查询或一堆if子句复制sql。基本上查询将取决于点击的链接,但我不知道如何在逻辑中显示。我也不确定为什么$ result中的SQL查询失败。

7 个答案:

答案 0 :(得分:3)

UPDATE :我将Eran的功能集成到重构代码中。注意:我通过将$ table变量传递给它并重命名它来更正它,因为它不搜索查询文本但主要返回所需的行!

主要错误

  • 错误1:在所有破坏代码的情况下,用query2覆盖查询。
  • 错误2:LIKE'%$ query%'LIKE和'=>之间缺少空格喜欢'%......这很可能会破坏你的代码

其他问题

  • 安全问题:sql注入危险,请使用mysql_real_escape_string
  • \ n非平台无关:使用PHP_EOL
  • 写短文块的替代方法
  • 使用大括号表示正常结构和所有此类结构

这是您的代码有一些更改,查看评论

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

答案 1 :(得分:2)

"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%'"

答案 2 :(得分:2)

用于功能使用:

$result = mysql_query($sql_query) or die(mysql_error());

看看你得到了什么样的mysql错误。

答案 3 :(得分:2)

你应该像 nickf 那样说。

你肯定倾向于SQL注入:

wikibooks:http://en.wikibooks.org/wiki/Programming:PHP:SQL_Injection 长篇文章:http://www.securiteam.com/securityreviews/5DP0N1P76E.html

答案 4 :(得分:2)

您可以在接受搜索文本作为参数的函数中抽象查询。类似的东西:

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)。它的可读性更好,有助于避免不必要的错误。

答案 5 :(得分:0)

您没有在IF / THEN / ELSE结构中包含声明,因此只有条件执行每个块中的第一个语句,其余的总是如此。

在大多数情况下,您将$ query2分配给$ query,而$ query2可能尚未定义。

另一个提示:清理你的输入,不要将用户输入粘贴到你的SQL中,这很危险。

答案 6 :(得分:0)

您可能需要LIKE和'%$ query%'之间的空格。此外,您应该查看mysql_error()函数 - 让MySQL准确地告诉您错误是什么。