1

ユーザーが入力した複数のパラメーターを受け取るフォームがあります。次に、それらを使用してレコードを検索および取得します。クエリは複数のテーブルを結合する必要がありますが、パラメーター値はユーザーから取得されるため、私のコードは現在、複数の住所を持つ同一人物など、外積を使用して複数のレコードを作成しています。

これが私のコードです:

if( $_POST["submit"] ) {

if (!($stmt =$mysqli->prepare(" SELECT DISTINCT Fname, Minit, Lname, EMPLOYEE.Phone, Address, Sname, Saddress, Dno, Hourly
    FROM EMPLOYEE, DEPARTMENT, LOCATION
    WHERE EMPLOYEE.Fname=? OR EMPLOYEE.Lname=? OR EMPLOYEE.Dno=? OR LOCATION.Store_num=?"))) {      
print "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
if (!$stmt->bind_param("ssii",$_POST['Fname'], $_POST['Lname'], $_POST['Dno'], $_POST['Store_num'])) {
print "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}
if (!$stmt->execute()) {
    print "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
    }       
$stmt->store_result();
if (!$stmt->bind_result($Fname,$Minit,$Lname,$Phone,$Address,$Slocation,$Saddress,$Dno,$Hourly)) {
         print "Binding output parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}
if ($stmt->num_rows == 0){
    print "No results were found for the following search <p>"
    .$_POST['Fname'].$_POST['Lname'].$_POST['Store_num'].$_POST['Dno']."</p>";
}

else {
    print "<table border=2 cellpadding=4>

        <tr bgcolor=white>

        <th>First Name</th>

        <th>Middle Initial</th>

        <th>Last Name</th>

        <th>Phone</th>

        <th>Address</th>

        <th>Store</th>

        <th>Store Location</th>

        <th>Dept #</th>

        <th>Hourly Rate</th>

        </tr>";

while ($stmt->fetch()){

    print "<tr><td>".$Fname."</td><td>".$Minit."</td><td>".$Lname.

    "</td><td>".$Phone."</td><td>".$Address."</td><td>".$Slocation."</td>
    <td>".$Saddress."</td><td>".$Dno."</td><td>".$Hourly."</td></tr>";
    }

print "</table>";
}
4

1 に答える 1

0

これにアプローチする 1 つの方法は、渡されるパラメーターに応じて SQL クエリを動的に形成することです。ユーザーがその値をフィルター処理しようとしている場合にのみ、LOCATION テーブルに参加したいようです。結合しても値が渡されなかった場合、余分な行が返されることがあります。

Dnoまた、これがDEPARTMENT と EMPLOYEE を結合するキーであり、それが LOCATION と DEPARTMENT を結合するキーであると想定していることにも注意Store_numしてください。どちらでもない場合は、それらを自分のキーに変更してください。あなたの質問から私が持っていない情報がいくつかありますが、次の概念はあなたがする必要があるものです。

$fromClause = '';
$whereClause = '';

// If they have filtered on Store_num, add the relevant bits to the query
$if(isset($_POST['Store_num'])) {
    $fromClause = " INNER JOIN LOCATION ON LOCATION.Store_num = DEPARTMENT.Store_num ";
    $whereClause = " OR LOCATION.Store_num = ?";
}

$query = '
SELECT 
    DISTINCT Fname, Minit, Lname, EMPLOYEE.Phone, Address, Sname, Saddress, Dno, Hourly 
FROM 
    EMPLOYEE 
INNER JOIN 
    DEPARTMENT ON DEPARTMENT.Dno = EMPLOYEE.Dno
' . $fromClause . '
WHERE 
    EMPLOYEE.Fname=? OR EMPLOYEE.Lname=? OR EMPLOYEE.Dno=?
' . $whereClause;
于 2012-11-26T01:19:23.010 に答える