0

重複の可能性:
mysqli_stmtパラメーターを動的にバインドしてから、結果をバインドします(PHP)

PHPで動的bind_resultを作成する方法について誰かが私を助けてくれますか?クエリフィールドは動的に作成されたため、フィールドがいくつあるかわかりません(たとえば、日付範囲に基づいて年フィールドを作成します)。以下は私のスクリプトであり、問​​題がどこにあるかを強調しています。

public function getMarketingReports($datefrom,$dateto)
    {
        $yearfrom = date("Y", strtotime($datefrom));
        $yearto = date("Y", strtotime($dateto));

        //create year fields
        $concatYear = "";
        for($year=$yearfrom;$year<=$yearto;$year++){
            $concatYear .= "SUM(IF(c.datecreated='".$year."',IF(LOWER(c.fullTimeEployeeType)='basic hour rate', c.fullTimeEployeeTypeAmount*2080 , c.fullTimeEployeeTypeAmount),0)) ".$year.",";
        }


        $reportdata = array();
        $db = Connection::Open();
        $stmt = $db->stmt_init();
        if($stmt->prepare("SELECT p.Code `PositionCode`,
                                  p.name `PositionName`,
                                  l.value `Location`,
                                  ".$concatYear."
                                  SUM(b.field205) `TotalEmployees`
                             FROM c1 c
                            INNER JOIN b1 b
                               ON c.registrationid=b.id
                            INNER JOIN positions p
                               ON c.positionid=p.id
                            INNER JOIN lookupvalues l
                               ON c.location=l.id
                            WHERE c.`status`!=2
                              AND c.datecreated BETWEEN ? AND ?
                            GROUP BY c.positionid,c.location,YEAR(c.datecreated)")){

            $datefrom = $datefrom." 00:00:00";
            $dateto = $dateto." 23:59:59";
            $stmt->bind_param("ss",$datefrom,$dateto);
            $stmt->execute();
            $stmt->bind_result
            (
                $positionCode,
                $positionName,
                $location,

                **//getting bind result data here for year fields**

                $totalEmployees
            );
            while($stmt->fetch())
            {
                $surveydata = array();
                $surveydata['positionCode'] = $positionCode;
                $surveydata['positionName'] = $positionName;
                $surveydata['location'] = $location;

                **//storing of data here for year fields**

                $surveydata['totalEmployees'] = $totalEmployees;
                array_push($reportdata,$surveydata);
            }
        }
        Connection::Close();
        return $reportdata;

    }

出来ますか?誰かがこの問題をどのように解決できるかについて私を助けることができますか

4

2 に答える 2

10

まず、フィールドを生成するコードには、適切な構文エラーがあります。

"SUM(IF(c.datecreated='".$year."',IF(LOWER(c.fullTimeEployeeType)='basic hour rate', c.fullTimeEployeeTypeAmount*2080 , c.fullTimeEployeeTypeAmount),0) ".$year.","

冒頭陳述にSUM(閉じ括弧がありません。その上".$year."、囲まれたメソッドのいずれにも含まれていないフローティングがあります(ただし、エイリアスとして使用できます。前に付けずに表示することに慣れていません。ASしたがって、これは私の間違いである可能性があります。 )。".$year."推測すると、をaに置き換えると、)その部分が修正されます。

$concatYear .= "SUM(IF(c.datecreated='".$year."',IF(LOWER(c.fullTimeEployeeType)='basic hour rate', c.fullTimeEployeeTypeAmount*2080 , c.fullTimeEployeeTypeAmount),0)),";

追加が実際にエイリアスである場合$yearは、関数を閉じるために、その直前に閉じ括弧を追加できSUM()ます。

変数を動的にバインドすることに関して、私の理想的な解決策は、実際にはSOに関する同様の質問/回答から得られます(これは直接のコピー/貼り付けであり、私はそれを信用しませんが、私はそれが好きです= P):

    // Get metadata for field names
    $meta = $stmt->result_metadata();

    // This is the tricky bit dynamically creating an array of variables to use
    // to bind the results
    while ($field = $meta->fetch_field()) { 
        $var = $field->name; 
        $$var = null; 
        $fields[$var] = &$$var;
    }

    // Bind Results
    call_user_func_array(array($stmt,'bind_result'),$fields);

    // Fetch Results
    $i = 0;
    while ($stmt->fetch()) {
        $results[$i] = array();
        foreach($fields as $k => $v)
            $results[$i][$k] = $v;
        $i++;
    }
于 2012-09-28T02:32:04.653 に答える
1

あなたがしなければならないcall_user_func_array

call_user_func_array(array($stmt, "bind_result"), $argArray);

そして、あなたはこのように記入$argArrayします:

$years = array();

$concatYear = "";
for($year=$yearfrom;$year<=$yearto;$year++){
    $concatYear .= "SUM(IF(c.datecreated='".$year."',IF(LOWER(c.fullTimeEployeeType)='basic hour rate', c.fullTimeEployeeTypeAmount*2080 , c.fullTimeEployeeTypeAmount),0) ".$year.",";

    // track the years you need
    $years[] = $year;

}

...

//you prepare all the vars here
$argArray = array(
    $positionCode,
    $positionName,
    $location
);

//loop the years
foreach($years as $y)
{

    $argArray[] = ${$y};

}

$argArray[] = $annualSalary;
$argArray[] = $totalEmployees;
$argArray[] = $yearOfData;  

そして、あなたは何年も後にこのように何かをします:

...

foreach($years as $y)
{

$surveydata[$y] = ${$y};

}
于 2012-09-28T02:34:02.417 に答える