我想知道是否有人可以帮助解决我遇到的概念问题,或者是否有更好的方法。 基本上我通过搜索栏在数据库中搜索一系列术语。 我有一个循环遍历每个术语的函数,然后将其用于搜索。它将所有内容放在一个数组中,然后返回数组,然后将其处理成一个表。 搜索工作正常,我插入条款,它循环通过他们将行推入数组。现在,因为我正在推进不同的数组,我所拥有的父数组具有索引键,我想将其更改为术语的键,并且在数组中有两个其他数组1用于结果数量,另一个用于结果。
// Search index php
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
</head>
<body>
<div id="search">
<form id= "search" action="searchresults.php" method="POST">
<input type="text" name="txtsearch" size="30" id="txtsearch">
<input type="submit" name="srchbtn" id="srchbtn">Search</button>
</form>
</body>
</html>
//Search PHP
<?php
include_once "iud.php";
$arrayval = array();
if(isset($_POST['txtsearch'])){
$search=$_POST['txtsearch'];
}else{
$search = '';
}
$search1 = explode(" ", $search);
array_push($arrayval, $search1);
$combined = array();
foreach ($arrayval as $val){
$orIndex = checkOr($val);
if(empty($orIndex)){
$valcntr = count($val);
$results = getResults($val);
print_r($results);
}
}
function getResults($array){
include_once "iud.php";
$db = connectDatabase();
$totalResults = array();
$length = count($array);
for ($i = 0; $i < $length; $i++){
$outputDisplay = "";
$myrowcount = 0;
$sql_statement = "SELECT userid, username, firstname, lastname ";
//, congroup, cattype, company, position, email, website, phone, mphone, wphone, fax, add1, add2, city, state, zip, country, reference, entrydate, enteredby, notes ";
$sql_statement .= "FROM userlist ";
$sql_statement .= "WHERE (firstname LIKE '%$array[$i]%' or lastname LIKE '%$array[$i]%')";
$sql_statement .= "ORDER BY lastname, firstname";
$sqlResults = selectResults($db, $sql_statement);
$error_or_rows = $sqlResults['resultNum'];
if (substr($error_or_rows, 0 , 5) == 'ERROR')
{
$outputDisplay .= "<br />Error on DB";
$outputDisplay .= $error_or_rows;
} else {
array_push($totalResults, $sqlResults);
$arraySize = $error_or_rows;
}
}
return ($totalResults);
}
function buildTable($totalResults){
include_once "iud.php";
$outputDisplay = "";
$outputDisplay .= '<div id="resultstable">';
$outputDisplay .= '<ul id="results">';
$myrowcount = 0;
for ($i=0; $i < count($totalResults); $i++)
{
$myrowcount++;
$contactid = $totalResults[$i]['userid'];
$firstname = $totalResults[$i]['firstname'];
$lastname = $totalResults[$i]['lastname'];
$pcat = $totalResults[$i]['username'];
$outputDisplay .= '<li id='.$contactid.' class="indRes" ';
$outputDisplay .= 'name="'.$contactid.'" >';
$outputDisplay .= '<span style="font-size:10px;cursor:pointer" onclick="getContactsToForm();">';
$outputDisplay .= '<h3>'.$firstname.' ' .$lastname. '</h3>';
$outputDisplay .= '</span>';
$outputDisplay .= '</li>';
}
$outputDisplay .= '</ul>';
$outputDisplay .= "</div>";
return $outputDisplay;
}
function checkOr($searchArray){
if (in_array("OR",$searchArray)){
$orPos = array_search("OR", $searchArray);
if (!empty($orPos)){
$surrVal = "";
$surrVal = --$orPos;
$orValArray = array();
array_push($orValArray,$searchArray[$surrVal]);
$surrVal = $orPos+2;
array_push($orValArray,$searchArray[$surrVal]);
return $orValArray;
}
}
}
?>
//common functinos IUD
<?php
function connectDatabase()
{
$db = mysqli_connect('localhost','root','');
if (!$db)
{
print "<h1>Unable to Connect to mysqli</h1>";
}
$dbname = 'test';
$btest = mysqli_select_db($db, $dbname);
if (!$btest)
{
print "<h1>Unable to Select the Database</h1>";
}
return $db;
}
function selectResults($db, $statement)
{
$output = "";
$outputArray = array();
$db = connectDatabase();
if ($db)
{
$result = mysqli_query($db, $statement);
if (!$result) {
$output .= "ERROR";
$output .= "<br /><font color=red>mysqli No: ".mysqli_errno();
$output .= "<br />mysqli Error: ".mysqli_error();
$output .= "<br />SQL Statement: ".$statement;
$output .= "<br />mysqli Affected Rows: ".mysqli_affected_rows()."</font><br />";
array_push($outputArray, $output);
} else {
$numresults = mysqli_num_rows($result);
$outputArray['resultNum'] = $numresults;
for ($i = 0; $i < $numresults; $i++)
{
$row = mysqli_fetch_array($result);
$outputArray["rowArray"] = $row;
}
}
} else {
array_push($outputArray, 'ERROR-No DB Connection');
}
return $outputArray;
}
function iduResults($db, $statement)
{
$output = "";
$outputArray = array();
$db = connectDatabase();
if ($db)
{
$result = mysqli_query($db, $statement);
if (!$result) {
$output .= "ERROR";
$output .= "<br /><font color=red>mysqli No: ".mysqli_errno();
$output .= "<br />mysqli Error: ".mysqli_error();
$output .= "<br />SQL Statement: ".$statement;
$output .= "<br />mysqli Affected Rows: ".mysqli_affected_rows()."</font><br />";
} else {
$output = mysqli_affected_rows();
}
} else {
$output = 'ERROR-No DB Connection';
}
return $output;
}
?>
我的搜索返回一个数组,打印时看起来像这样:
Array(
[0]=>Array
(
[resultNum]=>1
[rowArray]=>Array(
[0]=>1
[userid]=>1
etc
)
)
[1]=>Array
(
[resultNum]=>1
[rowArray]=>Array(
[0]=>2
[userid]=>2
etc
)
)
我想将两个外部数组的键[0],[1]
放入通过getResults($array)
函数循环中使用的搜索项中。
有什么想法吗?
答案 0 :(得分:0)
更改
array_push($totalResults, $sqlResults);
为:
$totalResults[$array[$i]] = $sqlResults;
使其成为关联数组而不是索引数组。
P.S。您应该学会使用foreach
循环数组元素,并使用预准备语句来阻止SQL注入。
此外,selectResults()
仅返回查询的最后一行。它应该是:
} else {
$numresults = mysqli_num_rows($result);
$outputArray['resultNum'] = $numresults;
$outputArray['rowArray'] = array();
for ($i = 0; $i < $numresults; $i++)
{
$row = mysqli_fetch_array($result);
array_push($outputArray["rowArray"], $row);
}
这样它每次都会返回所有行而不是覆盖rowArray
。