因此,我正在股票報價頁面上,並且在「查找符號頁面」中,用戶輸入公司的符號,並且將輸出存儲在數據庫中的任何以與用戶輸入完全相同的字母開頭的符號放在桌子上。如何提取數據庫中與用戶輸入相同的字母開頭的所有值?
SOLVED-回答以下
因此,我正在股票報價頁面上,並且在「查找符號頁面」中,用戶輸入公司的符號,並且將輸出存儲在數據庫中的任何以與用戶輸入完全相同的字母開頭的符號放在桌子上。如何提取數據庫中與用戶輸入相同的字母開頭的所有值?
SOLVED-回答以下
你在小寫輸入並存儲在大寫
因此改變你的查詢字符串轉換成上,然後搜索 最好是在兩側上的where子句。
$query = "SELECT symSymbol, symName FROM symbols " .
"WHERE upper(symSymbol) LIKE '%".strtoupper($strSymbol)."%'";
這是怎麼一回事?請在你的代碼中看到我的評論。
if(!$result)
{
print "Invalid Query Result<br />\n";
}
else
{
//============ This line is your main issue ============
$row = @$result->fetch_assoc(); //<-- pulling a row here advances the
//data set to row #2 (you never use the data from this row)
//======================================================
print "<table border='3' >\n";
print "<tr><th>Symbol</th>"
. "<th>Company Name</th>"
. "<th>Quotes Page</th" //<<--- unclosed </th>
. "<tr><th>History Page</th></tr>\n"; //<<--- misplaced <tr>
}//<<--- end if($result) block,
/*
anything below this is outside of the scope of the check for the result,
this will give you partial HTML and errors in the event of $result = false
*/
/*
because, you already advanced the dataset by one row, the loop starts on row 2
If you only had 1 row in your result set, then nothing is output from this block
While loops do not rewind, like a foreach (besides I don't think you can rewind the DB result cursor)
*/
while($row = @$result->fetch_assoc())
{
extract($row); //<<--- avoid using this as it pollutes the scope, also where exactly are you using these variables it creates
print "<tr>";
print "<td>{$row["symSymbol"]}</td>";
print "<td align='right'>{$symName}</td>";
print "<td><a href=\"quotes.php?Name=" . $row["symSymbol"]. "\"> Quotes Page</a></td>";
print "<td><a href=\"history.php?Name=" . $row["symSymbol"]. "\"> History Page</a></td>";
print "</tr>\n";
}
print "</table>\n";
讓我們通過清理,截至
if(!$result){
print "Invalid Query Result<br />\n";
}else{
print "<table border='3' >\n";
/*
don't be afraid to indent or format things in a way that helps
keep track of the tags. Not like the "tab" police are going to
bust you for using all the tabs up.
*/
print "<tr>";
print "<th>Symbol</th>"
. "<th>Company Name</th>"
. "<th>Quotes Page</th>"
. "<th>History Page</th>\n";
print "</tr>\n";
while($row = $result->fetch_assoc()){
/*
Try to use a consistent style for outputting, if possible.
*/
print "<tr>";
print "<td>{$row["symSymbol"]}</td>"
. "<td align='right'>{$symName}</td>"
. "<td><a href=\"quotes.php?Name=" . $row["symSymbol"]. "\"> Quotes Page</a></td>"
. "<td><a href=\"history.php?Name=" . $row["symSymbol"]. "\"> History Page</a></td>\n";
print "</tr>\n";
}
print "</table>\n";
}
你基本上扔掉你的結果集的第一行開始。當你調用這個..}else{ $row = @$result->fetch_assoc(); ..
時,你拉出第一行並將內部指針移到第2行。您不僅不會使用此數據,而且會使用while
循環中分配的值覆蓋$row
。現在while
循環不會倒回到第一個結果,因此您拉第2行並覆蓋$row
或覆蓋它與false
。這就是爲什麼當你有一場比賽時,你沒有得分。
其他一些事情提:
瞭解如何更清晰,簡潔我的代碼,良好的組織易於閱讀。編碼(IMO)時,可讀性是最重要的。
範圍,保留$result
東西在if塊。如果你不這樣做,那麼你會有一堆錯誤和無效的HTML。
如果你不打算使用它,請不要指定任何東西。雖然我明白,我只是「測試」或「工作」出來。這很好,但是當你遇到問題時你應該做的第一件事就是去你的代碼,組織它並清理它。從重構中移除任何「碎片」,並且添加註釋給任何不清楚的東西,只是看它自己的代碼。
extract
它會污染您的變量範圍。這意味着你可以在沒有意識到的情況下覆蓋變量。例如,假設你有這樣的代碼:
$name = 'John';
... bunch of other code ..
extract($row);
... more code ...
echo $name; //outputs Tom
現在不能夠直接看到的$row
的價值,你沒有辦法知道發生了什麼事只要看一眼的代碼。使用它只是一個不好的做法(IMO),因爲您不想使用$row['name']
。
希望有所幫助。
謝謝,這真的很有幫助!是的,我的代碼是一團糟,這幫助我更好地理解它。 – John
當然,這是沒有問題的,我一直在編碼像6年,我可以做,我睡覺。我可能每天寫幾千行代碼。很容易發現問題。 – ArtisticPhoenix
您正在分配第一行,緊接着'} else {',那麼當您使用'while'循環迭代時覆蓋它。你從不使用第一行,所以當你只有一行時,你沒有。 (while循環不會將結果集重置爲0)您還有其他一些小問題。我在回答中概述了他們。 – ArtisticPhoenix