我有这段代码
http://www.nomorepasting.com/getpaste.php?pasteid=22580
是小型ajax应用程序的一部分。我想知道一种更好,更有效的方式来分配$ query,而不是每次使用不同的查询或一堆if子句复制sql。基本上查询将取决于点击的链接,但我不知道如何在逻辑中显示。我也不确定为什么$ result中的SQL查询失败。
答案 0 :(得分:3)
UPDATE :我将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
答案 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准确地告诉您错误是什么。