2017-07-29 2 views
-2

私はこの機能を持っている:? nはPhpStormで

CASE1:。それがあるべきよう

public function searchArticle($keyword) 
{ 
    $keyword = sanitize($keyword, 15); 

    $sql = "SELECT a.*, c.id as cid, c.name" . Lang::$lang . " as catname, a.title" . Lang::$lang . " as atitle, c.slug as catslug, u.username," 
     . "\n (SELECT COUNT(artid) FROM " . self::cmTable . " WHERE artid = a.id) as totalcomments, YEAR(a.created) as year, MONTH(a.created) as month, DATE_FORMAT(a.created, '%d') as day," 
     . "\n (SELECT GROUP_CONCAT(DISTINCT participant) FROM " . self::partTable . " WHERE FIND_IN_SET(id,a.participants) > 0)as participants" 
     . "\n FROM " . self::mTable . " as a" 
     . "\n LEFT JOIN " . self::ctTable . " as c ON c.id = a.cid" . "\n LEFT JOIN users as u ON u.id = a.uid" 
     . "\n WHERE MATCH (title" . Lang::$lang . ", body" . Lang::$lang . ") AGAINST ('" . self::$db->escape($keyword) . "*' IN BOOLEAN MODE)" 
     . "\n AND a.created <= NOW()" . "\n AND (a.expire = '0000-00-00 00:00:00' OR a.expire >= NOW())" 
     . "\n AND a.active = 1" 
     . "\n ORDER BY a.created DESC LIMIT 20"; 
    $row = self::$db->fetch_all($sql); 

    return ($row) ? $row : 0; 
} 

すべての行がある

私は、コードの再フォーマットオプションを使用する場合

さて、このコードのスタイルは、次のようになります。

事例2:

public function searchArticle($keyword) 
{ 
    $keyword = sanitize($keyword, 15); 

    $sql = "SELECT a.*, c.id as cid, c.name" . Lang::$lang . " as catname, a.title" . Lang::$lang . " as atitle, c.slug as catslug, u.username," . "\n (SELECT COUNT(artid) FROM " . self::cmTable . " WHERE artid = a.id) as totalcomments, YEAR(a.created) as year, MONTH(a.created) as month, DATE_FORMAT(a.created, '%d') as day," . "\n (SELECT GROUP_CONCAT(DISTINCT participant) FROM " . self::partTable . " WHERE FIND_IN_SET(id,a.participants) > 0)as participants" . "\n FROM " . self::mTable . " as a" . "\n LEFT JOIN " . self::ctTable . " as c ON c.id = a.cid" . "\n LEFT JOIN users as u ON u.id = a.uid" . "\n WHERE MATCH (title" . Lang::$lang . ", body" . Lang::$lang . ") AGAINST ('" . self::$db->escape($keyword) . "*' IN BOOLEAN MODE)" . "\n AND a.created <= NOW()" . "\n AND (a.expire = '0000-00-00 00:00:00' OR a.expire >= NOW())" . "\n AND a.active = 1" . "\n ORDER BY a.created DESC LIMIT 20"; 
    $row = self::$db->fetch_all($sql); 

    return ($row) ? $row : 0; 
} 

私が得ることができる最も近いのは、 "Preferences/Code Style/PHP/Wapping and Braces"で "Binary expressions"を "always wrap"に設定することですが、それはまだそうではなく、読める。

CASE3:私は前に新しい行を強制するために、PhpStormのコードの再フォーマット設定を設定するにはどうすればよい

public function searchArticle($keyword) 
{ 
    $keyword = sanitize($keyword, 15); 

    $sql = 
     "SELECT a.*, c.id as cid, c.name" . 
     Lang::$lang . 
     " as catname, a.title" . 
     Lang::$lang . 
     " as atitle, c.slug as catslug, u.username," . 
     "\n (SELECT COUNT(artid) FROM " . 
     self::cmTable . 
     " WHERE artid = a.id) as totalcomments, YEAR(a.created) as year, MONTH(a.created) as month, DATE_FORMAT(a.created, '%d') as day," . 
     "\n (SELECT GROUP_CONCAT(DISTINCT participant) FROM " . 
     self::partTable . 
     " WHERE FIND_IN_SET(id,a.participants) > 0)as participants" . 
     "\n FROM " . 
     self::mTable . 
     " as a" . 
     "\n LEFT JOIN " . 
     self::ctTable . 
     " as c ON c.id = a.cid" . 
     "\n LEFT JOIN users as u ON u.id = a.uid" . 
     "\n WHERE MATCH (title" . 
     Lang::$lang . 
     ", body" . 
     Lang::$lang . 
     ") AGAINST ('" . 
     self::$db->escape($keyword) . 
     "*' IN BOOLEAN MODE)" . 
     "\n AND a.created <= NOW()" . 
     "\n AND (a.expire = '0000-00-00 00:00:00' OR a.expire >= NOW())" . 
     "\n AND a.active = 1" . 
     "\n ORDER BY a.created DESC LIMIT 20"; 
    $row = self::$db->fetch_all($sql); 

    return ($row) ? $row : 0; 
} 

。 「\ nは?(それはCASE1に見ることができるように)

+0

なぜ最初にそのような行を連結していますか?文字列リテラルは、細かい行にまたがることができます。 –

+0

あなたは間違いなくパラメータを使うべきです。 1.パラメータを持つSQLクエリを定義します。 2.バインドパラメータ 3.クエリを実行します。 DBクラスが一種の 'bind_param'メソッドを実装すると思います。そうでなければ、それを実装します。または既に利用可能なDBクラスを使用してください。 – slava

答えて

2

クエリを含む文字列のためのheredoc syntaxを使用してください。

あなたは直接文字列(別名variables interpolation)に変数を埋め込むことができます。私はあなたを参照してくださいまた、クエリを構成するクラスの静的メンバとクラスの定数を使用して、彼らは、文字列の解析時に認識されません。しかし、あなたはまだsprintf()を使用してそれらを埋め込むことができます:パーセント記号(%)は特殊文字のためであるため

$sql = <<< END_QUERY 
    SELECT a.*, c.id as cid, c.name%s as catname, a.title%s as atitle, c.slug as catslug, u.username, 
     (SELECT COUNT(artid) FROM %s WHERE artid = a.id) as totalcomments, YEAR(a.created) as year, MONTH(a.created) as month, DATE_FORMAT(a.created, '%%d') as day, 
     (SELECT GROUP_CONCAT(DISTINCT participant) FROM %s WHERE FIND_IN_SET(id,a.participants) > 0)as participants 
    FROM %s as a 
     LEFT JOIN %s as c ON c.id = a.cid 
     LEFT JOIN users as u ON u.id = a.uid 
    WHERE MATCH (title%s, body%s) AGAINST ('%s*' IN BOOLEAN MODE) 
     AND a.created <= NOW() 
     AND (a.expire = '0000-00-00 00:00:00' OR a.expire >= NOW()) 
     AND a.active = 1 
    ORDER BY a.created DESC 
    LIMIT 20 
END_QUERY; 

$query = sprintf($query, Lang::$lang, Lang::$lang, self::cmTable, self::partTable, self::mTable, self::ctTable, Lang::$lang, Lang::$lang, self::$db->escape($keyword)); 

sprintf()、あなたは二倍にする必要がありますそれを表現するためにそれを表します(DATE_FORMAT(a.created, '%d')DATE_FORMAT(a.created, '%%d')になりました)。

それとも、クラスの静的プロパティ、クラス定数を抽出する場合は、sprintf()の使用を避けることができ、関数は、文字列の前にローカル変数を呼び出す:

$lang = Lang::$lang; 
$cmTable = Lang::cmTable; 
$kword = self::$db->escape($keyword); 
// ... 
$sql = <<< END_QUERY 
    SELECT a.*, c.id as cid, c.name{$lang} as catname, a.title{$lang} as atitle, c.slug as catslug, u.username, 
// ... 

コードの書式設定ツールは、任意のクエリには触れません。この方法でもっと。ボーナスとして、すべてのテキスト、それ以上の引用符と文字列の連結ではないため、クエリは読みやすくなります。