PHP/mysql:使用数组查询mysql并在数组中获得结果

PHP/mysql:使用数组查询mysql并在数组中获得结果,php,mysql,arrays,sorting,Php,Mysql,Arrays,Sorting,我有一个数组。我想用该数组中的所有值查询MySQL,并将结果返回到一个数组中。例如,扫描中的样本数据为: E1234 E2244 E3654 MYSQL表PARTS包含字段part、size、length、plate、side、type 我希望以$output[“E1234”][0]作为该部分的大小结果,1作为长度,等等。我希望通过MYSQL查询对数组进行排序。(按侧面描述,板asc订购) 现在,我只是单步遍历$SCANS数组,一个接一个地执行查询,但无法对所有结果进行正确排序 这可能吗?这就

我有一个数组。我想用该数组中的所有值查询MySQL,并将结果返回到一个数组中。例如,扫描中的样本数据为:

E1234
E2244
E3654
MYSQL表
PARTS
包含字段
part、size、length、plate、side、type

我希望以
$output[“E1234”][0]
作为该部分的大小结果,1作为长度,等等。我希望通过MYSQL查询对数组进行排序。(按
侧面描述,板asc
订购)

现在,我只是单步遍历
$SCANS
数组,一个接一个地执行查询,但无法对所有结果进行正确排序

这可能吗?这就是我现在要做的,但是很明显,因为每个查询返回一行,然后输出,所以没有可排序性。我希望能够执行一个查询,在数组中对结果进行排序,然后在排序后输出数据

    foreach ($scans as $currentscan) {
        $partselect = substr(mysql_real_escape_string($currentscan), 0, 5);

        $query = "SELECT french, length, plate, side, type FROM parts WHERE part = '$partselect' ORDER BY side DESC, plate ASC LIMIT 1";
        $result = mysql_query($query);
        #echo 'query is '.$query.'   <br>';
        $error = mysql_error();
        $num_rows = mysql_num_rows($result);
        if ($num_rows == 0) {
            echo 'BAD PART: '.$currentscan.' '.$partselect.' error is '.$error.'<br \>
            ';
        } else {
            $row = mysql_fetch_array($result);
            print $partselect.' is a '.$row['french'].'/'.$row['length'].' - '.$row['type'].' - '.$row['plate'].'('.$row['side'].')<br \>';
        }
    };
结果是:

警告:mysql_fetch_array():在第35行的/home/foo/bar/sort.php中,提供的参数不是有效的mysql结果资源

第35行是 while($row=mysql\u fetch\u数组($result)){

最终编辑:

它起作用了

//DECLARED CONSTANTS//

if (!$_POST) { // Have scans been entered? If not, display the form.
print '
<html>
<body>
Scans:
<form action="index.php" method="post">
<textarea rows="20" cols="6" name="scans" id="scans">
</textarea>
<br />
<input type="submit" value="Submit" />
</body>
</html>
';
} else { //Scans have been entered. Start scan processing logic

//==openDB==//
mysql_connect(SQLSERVER, SQLUSER, SQLPASSWORD) or die("Can not connect to DB server.");
mysql_select_db(DATABASE) or die("Can not connect to Database.");
//==openDB==//

$scans = explode("\n",$_POST['scans']); // Explode posted scans into scans array

foreach ($scans as $currentscan) { // step through each scan
   if ($currentscan[0] == "E") { //Cheap check for real part numbers.
   $partselect = substr(mysql_real_escape_string($currentscan), 0, 5); // Strip off the extraneous data from the scan
   $count{$partselect}++; //Count instances of particular parts. ideally this would be in an array in the form of $count[$partnumber] so I can easily display that data at the end. each part needs to be displayed every time it's scanned.
   $tempQuery .= 'part = "'.$partselect.'" OR '; //Starts building query

   };
};//end foreach 
$tempQuery = substr($tempQuery, 0, -3); //remove last OR 

$tempQuery .= ") ORDER BY side DESC, plate ASC"; //add on end of query 
$query = "SELECT part, french, length, plate, side, type FROM parts WHERE (".$tempQuery; //Form beginning of query
$result = mysql_query($query);// execute query
while($row = mysql_fetch_array($result)){ // step through results
   for ($i = 0; $i < $count{$row['part']}; $i++) { //if a part was scanned $count{$row['part']} times, display it that many times
   print $row['part']." ".$row['french']." / ".$row['length']." ".$row['plate']."(".$row['side'].")<br>";  //data parsing goes here. this will be expanded.
   };// close for loop
};//close while loop        
};//close else

?>
//声明的常量//
如果(!$\u POST){//是否已输入扫描?如果未输入,则显示表单。
印刷品
扫描:

'; }否则{//已输入扫描。启动扫描处理逻辑 //==openDB==// mysql_connect(SQLSERVER、SQLUSER、SQLPASSWORD)或die(“无法连接到DB服务器”); mysql_选择_db(数据库)或死亡(“无法连接到数据库”); //==openDB==// $scans=explode(“\n”,$\u POST['scans']);//将已发布的扫描分解为扫描数组 foreach($scans as$currentscan){//逐步完成每次扫描 如果($currentscan[0]==“E”){//,请检查实际零件号。 $partselect=substr(mysql_real_escape_string($currentscan),0,5);//从扫描中去除无关数据 $count{$partselect}++;//计算特定部件的实例。理想情况下,这将以$count[$partnumber]的形式出现在一个数组中,因此我可以轻松地在末尾显示该数据。每次扫描时都需要显示每个部件。 $tempQuery.='part=“”。$partselect.”或“;//开始生成查询 }; };//结束foreach $tempQuery=substr($tempQuery,0,-3);//删除最后一个或 $TEMPQERY.=”)按侧面说明订购,板ASC“;//在查询结束时添加 $query=“从零件中选择零件、法文、长度、板材、侧面、类型,其中(“.$TEMPQERY;//构成查询的开头 $result=mysql\u query($query);//执行查询 而($row=mysql\u fetch\u array($result)){//逐步执行结果 对于($i=0;$i<$count{$row['part']};$i++){//如果一个零件被扫描了$count{$row['part']}次,那么显示它很多次 打印$row['part'].“”.$row['french'].“/”.$row['length'].“”..$row['plate'].“(“$row['side'].”)
“;//数据解析在这里进行。这将被扩展。 };//闭环 };//边关闭边循环 };//关闭其他 ?>

查看更新/编辑后,可以使用IN子句

// Represents your $scans array
$arr = array('Hello','World!','Beautiful','Day!');

foreach ($arr as $currentscan) {
    $partselect[] = substr(mysql_real_escape_string($currentscan), 0, 5);
}

$inExpr = implode("','",$partselect);

$query = "SELECT french, length, plate, side, type FROM parts WHERE part IN('$inExpr') ORDER BY side DESC";

$result = mysql_query($query);

while($row = mysql_fetch_array($result)) {
    print $partselect.' is a '.$row['french'].'/'.$row['length'].' - '.$row['type'].' - '.$row['plate'].'('.$row['side'].')<br \>';
}
//表示您的$scans数组
$arr=array('Hello'、'World!'、'Beautiful'、'Day!');
foreach($arr as$currentscan){
$partselect[]=substr(mysql\u real\u escape\u string($currentscan),0,5);
}
$inner=内爆(“,”,$partselect);
$query=“从零件中选择法语、长度、板材、侧面、类型,其中零件按侧面描述($INPER')排序”;
$result=mysql\u query($query);
while($row=mysql\u fetch\u数组($result)){
打印$partselect。'是一个'.$row['FRENCE']./'.$row['length'.-'..-'.$row['type'.].-'.$row['plate'.].('.$row['side'.]);
}

您应该做的是在PHP中构造一个WHERE子句,它允许您选择包含任何零件号的所有行。类似如下:

$whereExpr = array();
for ($i = 0; $i < count($scans); $i++) {
  $whereExpr[] = "part = \"{$scans[$i]}\"";
}

$whereExpr = implode(" OR ", $whereExpr);

$query = "SELECT * FROM `parts` WHERE $whereExpr ORDER BY <whatev>";

$result = array();
while ($row = mysql_fetch_array) {
    $result[ $row['part'] ] = $row;
}
$whereExpr=array();
对于($i=0;$i
这并不是我想要的。为了更清楚,我使用代码示例进行了更新。@stephen我更新了您的代码,首先为$scans数组中的所有项目构建了查询,然后在之后循环返回结果集……这似乎可行,但substr语法似乎不正确,因为在这之后,$tempQuery=“R”(R和一个空格)@stephen更新了for循环,它需要一个。=for tempquery而不是a=这就是为什么你会得到那么坏的值。在我运行它时,用代码编辑了原始帖子以及它引发的错误。我将阅读mysql_fetch_arrayooh。这会创建一个giganto查询。我喜欢这个。尝试一下。如果这是用户为$whereExpr,当你打开数据库进行SQL注入时:是的,当然你应该使用mysql\u real\u escape\u string之类的。这只是一些快速组合起来的示例代码。这些代码是为一个内部数据库应用程序编写的,不会公开使用,但是会进行转义。Stephen你想看看buil吗t查询。它可能不完全正确。在迭代之前,检查num_行以查看是否得到结果。
<?php
// Make a MySQL Connection
$query = "SELECT * FROM example"; 

$result = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_array($result) or die(mysql_error());
echo $row['name']. " - ". $row['age'];

?>
<?php
// Make a MySQL Connection
$query = "SELECT * FROM example"; 

$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_array($result)){
   echo $row['name']. " - ". $row['age'];
}


?>
foreach ($scans as $currentscan) {
   $partselect = substr(mysql_real_escape_string($currentscan), 0, 5);
   $tempQuery .= "(part = ".$partselect." OR";
}//end foreach 
$tempQuery = substr($tempQuery,-2); //remove last OR 
$tempQuery .= ") ORDER BY side DESC, plate ASC LIMIT 1"; //add on end of query 
$query = "SELECT french, length, plate, side, type FROM parts WHERE ".$tempQuery;
$result = mysql_query($query);
while($row = mysql_fetch_array($result)){
   //do something with row in result set... 
}
$whereExpr = array();
for ($i = 0; $i < count($scans); $i++) {
  $whereExpr[] = "part = \"{$scans[$i]}\"";
}

$whereExpr = implode(" OR ", $whereExpr);

$query = "SELECT * FROM `parts` WHERE $whereExpr ORDER BY <whatev>";

$result = array();
while ($row = mysql_fetch_array) {
    $result[ $row['part'] ] = $row;
}