Не могу получить пробелы в моем операторе SQL - PullRequest
1 голос
/ 27 марта 2012

У меня есть две переменные в моем операторе WHERE.Я не могу отделить их пробелом, поэтому я получаю синтаксическую ошибку.Спасибо за помощь.

(я использую codeigniter)

Кстати, я попытался установить переменную $ space и поставить пробелы перед и, после установки обеих переменных и в sql.

ОШИБКА

Номер ошибки: 1064

В синтаксисе SQL имеется ошибка;обратитесь к руководству, соответствующему вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с 'source_adusers.ad_account = "Wolfs, Marc" GROUP BY rollout_systems.eam_user LIMIT' в строке 2

SELECT *, COUNT (rollout_systems.EAM_USER) как системы ИЗ rollout_systems ВЛЕВО ПРИСОЕДИНЯЙТЕСЬ к source_adusers ВКЛЮЧЕНО rollout_systems.EAM_User = source_adusers.ad_account WHERE rollout_systems.scope_ID = 3AND source_adusers.ad_account = "Wolfs, Marc" GROUP BY rollout_systems.eam_user330

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');

Ответы [ 4 ]

2 голосов
/ 27 марта 2012

что если вы сохраните пробелы и AND в запросе $ вместо того, чтобы встраивать их в переменные where?Тогда ваш $ где 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 голос
/ 27 марта 2012

Просто добавьте пробел между двумя переменными - '. $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 голосов
/ 27 марта 2012

У вас также есть возможность использовать синтаксис PHP

$sql = " blah blah {$my_var} {$my_other_var} ";
0 голосов
/ 27 марта 2012
$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"
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...