【问题标题】:Can't get data through CodeIgniter query builder from and ODBC Connection无法通过 CodeIgniter 查询生成器和 ODBC 连接获取数据
【发布时间】:2019-08-09 14:04:57
【问题描述】:

我正在尝试使用 Codeigniter 创建一个登录页面,我需要使用 ODBC 连接从 MS SQL 数据库收集数据,但我收到以下错误:

调用未定义的方法 CI_DB_odbc_driver::select()。

为什么会发生这种情况,我该如何解决?这是我第一次使用 CI 查询生成器连接到 ODBC MS SQL 数据库

型号

class Utilizador_model extends CI_Model {



    public function login($username,$password){
            $this->db->select('*');
            $this->db->from('utilizadores');
            $this->db->where('username', $username);
            $this->db->where('password', $password);
            $q = $this->db->get();

            if ($q->num_rows() > 0) {
             return $q->result_array();
            }else{
                return false;
            }
        }

我尝试过这样的事情:

$query = $this->db->query('SELECT * from utilizadores where username = "'.$username.'" AND password ='.$password);
    $resultado = $query->result_array();

    return $resultado;

但我收到以下错误:

消息:odbc_exec():SQL 错误:[Microsoft][ODBC SQL Server 驱动程序][SQL Server]列名“F”无效,SQL 状态 S0022 在 SQLExecDirect

'F' 是我在输入中输入的内容

【问题讨论】:

  • 我在调用函数之前已经完成了,我只需要知道如何从数据库中获取信息
  • 这甚至不是这篇文章的重点
  • 嘿@mario,我知道这不是您要的,但是您看起来好像是在要求使用该(第二个示例)代码进行sql注入攻击。 (您可能正在对自己进行实际上不起作用的 sql 注入攻击)关于您的问题,请检查您如何引用您的 sql。我相信这些值没有被正确引用,所以 sql server 认为你正在尝试比较两个字段而不是一个字段与一个字符串。不过,请再次考虑如何执行此操作并使用正确的 sql 插值,而不是连接包含用户输入的字符串。
  • 模型代码在这方面看起来更好。 (来自我上面的评论)
  • 在将值发送到模型之前,我在控制器上的每个变量中使用了 addlashes()。这足以防止sql注入吗?

标签: php sql-server codeigniter odbc


【解决方案1】:

这可能会起作用:

$sql = "SELECT * FROM utilizadores WHERE username = '$username' AND password='$password'";
$result = $conn->query($sql) or die($conn->error);

if ($result->num_rows > 0) {
  // return array
} else {
  return false;
}

这与我使用的 mysqli 库类似,但我不知道您是否愿意将其合并到您的项目中。使用起来轻而易举。

另外,您的方法似乎是以明文形式存储密码,这不是一个好主意。

编辑- 这就是我创建连接的方式:

$servername = "";
$username = "";
$password = "";
$dbname = "";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

EDIT #2:问题在于使用双引号而不是单引号。拜托,没有其他人会落入这个恶魔陷阱。

【讨论】:

  • 是的,我的意思是,忘记密码的东西,我已经处理好了我只想知道如何使用 CI 获取数据
  • @MarcoSilva 建议 here 你可以通过交换单引号和双引号来解决这个问题
  • @MarcoSilva SQL 在格式化方面非常具体。我的建议是接受它并继续生活,因为它会让你扯掉你的头发。如果这有帮助,请标记为已接受的答案:)
猜你喜欢
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
相关资源
最近更新 更多