2012-03-27 15 views
1

WHEREステートメントに2つの変数があります。私はスペースでそれらを区切るように私はシンタックスエラーを取得するように終わります。助けてくれてありがとう。私のSQLステートメントで空白を取得できません

は(私はCodeIgniterのを使用しています)

ところで私は$スペース変数を設定し、前と、両方の変数を設定した後、およびSQLにスペースを入れて試してみました。

ERROR

エラー番号:1064

あなたのSQL構文でエラーが発生しています。 'source_adusers.ad_account = "Wolfs、Marc" 2列目の "GROUP BY rollout_systems.eam_user LIMIT"の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを参照してください。

SELECT *、COUNT(rollout_systems.EAM_USER) rollout_systems FROMシステムは、左rollout_systems.EAM_User = source_adusers.ad_account ON source_adusersを登録しようとしてWHERE rollout_systems.eam_user限界によってrollout_systems.scope_ID = 3AND source_adusers.ad_account = "ウルフス、マーク" GROUP 0.50

行番号:330

PHP

if ($this->session->userdata('scopeId') != NULL) { 
     $where1 = 'WHERE rollout_systems.scope_ID = '. $this->session->userdata('scopeId') . ''; 
    } else { 
     redirect('/headquarters/home');; 
    } 

    if ($search) { 
     $where2 = ' AND rollout_systems.sys_name ="'.$search.'"'; 
    } else { 
     $where2 = ''; 
    } 
$query = $this->db->query('SELECT * FROM rollout_systems LEFT JOIN source_adusers 
     ON rollout_systems.eam_user = source_adusers.ad_account '. $where1 .''. $where2 .' GROUP BY rollout_systems.sys_name LIMIT '.$limit.',50'); 

答えて

2

どこの変数にスペースやANDを$クエリに入れずに保存すればよいでしょうか?それで、あなたの$は、クエリに影響を与えずに2だけ動作する必要があるので、0 = 0です。

if ($this->session->userdata('scopeId') != NULL) { 
     $where1 = 'WHERE rollout_systems.scope_ID = '. $this->session->userdata('scopeId') . ''; 
    } else { 
     redirect('/headquarters/home');; 
    } 

    if ($search) { 
     $where2 = 'rollout_systems.sys_name ="'.$search.'"'; 
    } else { 
     $where2 = '0=0'; 
    } 
$query = $this->db->query('SELECT * FROM rollout_systems LEFT JOIN source_adusers 
     ON rollout_systems.eam_user = source_adusers.ad_account '. $where1 .' and '. $where2 .' GROUP BY rollout_systems.sys_name LIMIT '.$limit.',50'); 
1

わずか2 VARSの間にスペースを追加 - '. $where1 .' '. $where2 .'

として、あなたは、整数値を期待している場合は、あなたが本当にmysql_real_escape_string()またはintval()を使用して、ユーザー入力をエスケープする必要がある他の人が指摘しています。 PDOまたはmysqliを使用している場合は、プリペアドステートメントを使用してください。 $this->dbはPDOインスタンスがある場合は

あなたは使用することができます -

$params = array(); 

if ($this->session->userdata('scopeId') != NULL) { 
    $where = 'WHERE rollout_systems.scope_ID = ?'; 
    $params[] = $this->session->userdata('scopeId'); 
} else { 
    redirect('/headquarters/home');; 
} 

if ($search) { 
    $where .= ' AND rollout_systems.sys_name = ?'; 
    $params[] = $search; 
} 

$sql = "SELECT * FROM rollout_systems 
    LEFT JOIN source_adusers ON rollout_systems.eam_user = source_adusers.ad_account 
    $where 
    GROUP BY rollout_systems.sys_name 
    LIMIT ?, 50"; 
$params[] = $limit; 

$query = $this->db->prepare($sql); 
$query->execute($params); 
0
$where = array(); 

if ($this->session->userdata('scopeId') != NULL) { 
    // better to escape your parameter here unless you trust it totally 
    // judging by its name, it's user-provided data, so I wouldn't trust it 
    $where[] = 'rollout_systems.scope_ID = '. $this->session->userdata('scopeId'); 
} else { 
    redirect('/headquarters/home'); 
    // you may need to exit here after redirection, depends on your implementation 
} 

if ($search) { 
    // once again don't forget to escape $search in real application 
    $where[] = "rollout_systems.sys_name = '" . $search . "'"; 
} 

$query = $this->db->query(" 
    SELECT 
     * 
    FROM 
     `rollout_systems` 
     LEFT JOIN 
     `source_adusers` 
     ON rollout_systems.eam_user = source_adusers.ad_account 
    WHERE 
     " . implode (' AND ', $where) . " 
    GROUP BY 
     rollout_systems.sys_name 
    LIMIT " . $limit /* escape it! */ . ",50" 
); 
0

また、PHPの構文を使用するオプションを持っている

$sql = " blah blah {$my_var} {$my_other_var} "; 
関連する問題