2017-10-30 10 views
0

MYSQLIクエリプリペアドステートメントに問題があります。ポスト値に基づいてコードを除外したいと思います。ここでプリペアドステートメントの変数からの動的フィルタの使用

は私のコードは私の成果はのMysqli上の動的フィルタは、書類を作成して$フィルターを使用することです

$arrfilter = array(); 
    if(!empty($_POST['website'])){ 
     $website = $conn->real_escape_string($_POST['website']); 
     array_push($arrfilter,"website='$website'"); 
    } 
    if(!empty($_POST['gamename'])){ 
     $gamename = $conn->real_escape_string($_POST['gamename']); 
     array_push($arrfilter,"gamename='$gamename'"); 
    } 
    if(!empty($_POST['action'])){ 
     $action = $conn->real_escape_string($_POST['action']); 
     array_push($arrfilter,"action='$action'"); 
    } 
    if(count($arrfilter) > 0){ 
     $filter = implode(' and ',$arrfilter); 
    } 
    $fdate= "%$date%"; 
    $sql = "SELECT url,referrer,ip,user_agent,action,date FROM cpa_track WHERE date LIKE ? and ? ORDER BY date DESC"; 
     $process = $conn->prepare($sql); 
     $process->bind_param('ss',$fdate,$filter); 
     $process->execute() or die("Error: ".$conn->e 

rror); 
    $process->store_result(); 

です。私はこの

Fatal error: Call to a member function bind_param() on a non-object

+0

'SELECT url、referrer、ip、user_agent、action、date FROM cpa_track where like LIKE? %$ date%ORDER BY date DESC'は有効ではありません。sql – bassxzero

+0

@bassxzeroまた、プリペアドステートメントを正しく使用しません。 – GrumpyCrouton

+0

@bassxzero。とにかくbind_paramとして%$ date%を入れました。私はちょうど条件付きで$フィルタ値を記入する必要があります。 –

答えて

0

を受けた私はこれを行うことができますどのように私はbind_param()のマニュアルページにthis commentの末尾にコードを使用して一緒にこれを置きます。私はmysqliではなくPDOを使用していますので、実際にこれをテストしていません。論理は健全だと思われる。コンセプトは、bind_params()に送信されるパラメータを段階的に作成し、次にreflectionを使用して構築された値を適用することです。ちょうど、私は名前付きのパラメータを使用してbindValue()を何度も呼び出すことができるため、これをPDOではるかに複雑ではないことが分かりました。

$conditions = ""; 
$types = "s"; 
$values = array($fdate); 

if(!empty($_POST['website'])){ 
    $conditions .= " AND website = ?"; 
    $types .= "s"; 
    $values[] = $conn->real_escape_string($_POST['website']); 
} 
if(!empty($_POST['gamename'])){ 
    $conditions .= " AND gamename = ?"; 
    $types .= "s"; 
    $values[] = $conn->real_escape_string($_POST['gamename']); 
} 
if(!empty($_POST['action'])){ 
    $conditions .= " AND action = ?"; 
    $types .= "s"; 
    $values[] = $conn->real_escape_string($_POST['action']); 
} 

$bindArray = array($types); 

foreach($values as $value) 
{ 
    $bindArray[] = $value; 
} 

$fdate= "%$date%"; 
$sql = "SELECT url,referrer,ip,user_agent,action,date FROM cpa_track WHERE date LIKE ? $conditions ORDER BY date DESC"; 
$process = $conn->prepare($sql); 

$refClass = new ReflectionClass('mysqli_stmt'); 
$refMethod = $refClass->getMethod("bind_param"); 
$refMethod->invokeArgs($process,$bindArray); 

$process->execute() or die("Error: ".$conn->error); 
$process->store_result(); 
+0

パラメータをバインドする場合は 'mysqli_real_escape_string'ですか? @DanielO。 https://stackoverflow.com/a/2284327/1461181 – DanielO

+0

いいえ、私はOPが持っていたものをコピーしていました。私は両方をしないだろう。おそらく、何らかの要求ベースの入力のサニタイズ/検証を行うことを示唆しているかもしれませんが、技術的な観点から見ると、バインディングは必要なだけです。 –

関連する問題