編輯:感謝spencer7593幫助我解決這個問題。我編輯了主要的代碼,爲後來的人提供了正確的表單。從PHP數組中搜索mySQL表中的多列vs固定
我目前正在圍繞着PHP和mySQL,並且在搜索mySQL時遇到了障礙。
我需要搜索表中的多個列進行部分匹配。我已經正確地使用一組固定的列來搜索,但是當我嘗試使用一個數組時,它失敗了,即使mySQL的輸出看起來相同。
任何人都可以指出我在某處做出的那個微小的愚蠢錯誤嗎?那還是改進的方式嗎?
<form name="search" method="post" action="<?php $PHP_SELF; ?>">
Search for: <input type="text" name="find" />
<input type="hidden" name="searching" value="yes" />
<input type="submit" name="search" value="Search" />
</form>
<?php
$dbdata=array(
'servername' => "localhost",
'username' => "Username",
'password' => "Password",
'dbname' => "Membership",
'table_Members' => "Members"
);
$fields=array(
'MemberID',
'FirstName',
'LastName',
'Nickname',
'Interests',
'Skills');
$output=array();
if(isset($_POST['searching'])) {
$output=read_db_search($dbdata['table_Members'],$_POST['find'],$fields);
}
echo ('<pre>');
var_dump($output);
echo ('</pre>');
function read_db_search ($table,$searchQuery,$fields)
{
global $dbdata;
$servername=$dbdata['servername'];
$dbname=$dbdata['dbname'];
$dbtable=$dbdata['table_Members'];
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $dbdata['username'], $dbdata['password']);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
/*This version works!!!!*/
$query = "SELECT * FROM `Members` WHERE `"
. implode("` LIKE '%$searchQuery%' OR `",$fields)
. "` LIKE '%$searchQuery%' " ;
/* This section should work but doesnt */
//$query="SELECT * FROM `Members` WHERE`'.implode(' ` LIKE \'%$searchQuery%\' OR `',$fields).'` LIKE \'%$searchQuery%\'";
//$stmt = $conn->prepare($query);
/* This one works fine */
/* $stmt = $conn->prepare("SELECT * FROM `Members` WHERE
`MemberID` LIKE '%$searchQuery%' OR
`FirstName` LIKE '%$searchQuery%' OR
`LastName` LIKE '%$searchQuery%' OR
`Nickname` LIKE '%$searchQuery%' OR
`Interests` LIKE '%$searchQuery%' OR
`Skills` LIKE '%$searchQuery%'");
*/
$stmt->execute();
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
$data=$stmt->fetchAll();
}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
return $data;
}
?>
$查詢返回的的var_dump:
string(89) "SELECT * FROM `Members` WHERE`'.implode(' ` LIKE \'%searchterm%\' OR `',Array).'` LIKE \'%searchterm%\'"
與錯誤:
Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'%searchterm%\' OR `',Array).'` LIKE \'%searchterm%\'' at line 1
「它失敗」是對觀察到的行爲的相當模糊的描述。我們還想知道是否拋出了PDO異常,是否存在MySQL語法錯誤,或者查詢是否返回意外的結果。請編輯問題以更明確地解釋您正在觀察的行爲。並且,將'$ query'的值回顯出來,並將其包含在您的問題中。 – spencer7593
現在很清楚,我錯過了它。 '.implode('需要在雙引號的*之外......在該點之前加一個雙引號(以終止前面的字符串文本),並且''後面還需要雙引號。在implode()的末尾。它看起來像「'數組」,需要用'$ fields'的引用來替換。這不是一個真正的MySQL問題,這是PHP字符串處理的一個問題。 ('$ query'的內容必須是有效的SQL文本。) – spencer7593