-1
function searchPaste($string, $err=false)
{
global $sql;
$buffer = $err?"SELECT * FROM `pastes` WHERE `exposure` = 'public' AND `title` LIKE ? OR `paste` LIKE ? OR `lang` LIKE ?":"SELECT * FROM `pastes` WHERE `exposure` = 'public' AND `title` LIKE ?";
echo $buffer."<br>";
$buffer = $sql->prepare($buffer);
$buffer->execute(array(sprintf("%%%s%%", $string)));
if(!$buffer->rowCount()>0)
        return 0;
return $buffer->fetchAll(PDO::FETCH_OBJ);
}

最初のクエリでわかるように、複数のケースで一致しています問題は「?」です。は一度しか処理されず、配列を使用してすべての原因でこれを行う方法がわかりません。

私に何ができるか知っている人はいますか?

4

2 に答える 2

0

クエリのプレースホルダーごとにバインド値/パラメーターを指定する必要があります。あなたは私が思う三項を廃止しなければならないでしょう。あなたはこのようなことを試すことができます...

$buffer = "SELECT * FROM `pastes` WHERE `exposure` = 'public' AND `title` LIKE ?";
$paramCount = 1;
if (!$err) {
    $buffer .= '  OR `paste` LIKE ? OR `lang` LIKE ?';
    $paramCount += 2;
}

$stmt = $sql->prepare($buffer);
$stmt->execute(array_fill(0, $paramCount, "%$string%"));
于 2013-11-12T23:01:50.177 に答える
-1
function searchPaste($string, $err=false)
{
    global $sql;
    $sql->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
    $query = "SELECT * FROM `pastes` WHERE `exposure` = 'public' AND (`title` LIKE :search";
    if ($err) {
        $query .= " OR `paste` LIKE :search OR `lang` LIKE :search";
    }
    $query .= ")";
    $stmt = $sql->prepare($query);
    $stmt->execute(array("search" => "%$string%")));
    return $stmt->fetchAll(PDO::FETCH_OBJ);
}

最終的にロジックを取得し、クエリを修正しました。

于 2013-11-12T23:05:42.980 に答える