【问题标题】:Prepared statement insertion error with odbc_prepare/execute in PHP在 PHP 中使用 odbc_prepare/execute 准备语句插入错误
【发布时间】:2013-10-22 14:41:42
【问题描述】:

用 PHP 编写,使用 odbc_prepare 和 odbc_execute,尝试插入 MS SQL。

基本上,我对这一切还是比较陌生,但我熟悉普通的(未准备好的)MySQL 和 MSSQL 查询。由于它们的安全价值,我现在正在尝试使用准备好的语句。这是我的代码:

PHP

  //$conn = db connection
  //$dbArray = array with sizeof = 26
  $stmt = odbc_prepare($conn, 'INSERT INTO W2_contact_us_FORM VALUES (?, ?, ?, ?, ?, ?,   
  ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
  $success = odbc_execute($stmt, $dbArray);
  if($success) {//success msg} else {//error msg}

另外,我觉得必须有比列出 26 更好的方法?但是,也许没有?感谢您的帮助!

edit -- 正在考虑切换到 PDO 而不是 odbc,因此,如果您更熟悉使用 pdo 的解决方案,我完全愿意,因为 PDO 现在似乎也内置于 PHP 中(希望)。

【问题讨论】:

    标签: php mysql sql sql-server sql-server-2008


    【解决方案1】:

    您可以使用命名参数,这至少可以使其更易于阅读,但您仍然需要将所有 26 个参数放入其中。使用 PDO,您将能够执行以下操作:

    insert into tableName values (:id, :val1, :val2 ....)
    

    它更容易阅读,并且对于其他阅读代码的人来说更有意义。

    然后,如果您决定使用 PDO 路径,您可以一举通过这样的数组传递所有参数:

    $prepared->execute(array(':ID' => $ID, ':val1' => $var1, ':val2' => $var2, ...)))
    

    编辑:我通常在我的代码中使用一些对象,如果您愿意,可以快速复制和粘贴:

    类文件:

    class mysqlDigitalcog
    {
        public $con;
    
        private $userName = "yourDBName";
        private $passWord = "yourPassword";
        private $hostName = "mysql:host=localhost;dbname=example"; 
        // Modify this to your connection
    
        private $isDebug=false;
    
        function __construct()
        {
            $this->con = new PDO ($this->hostName, $this->userName , $this->passWord);
            $this->con->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        }
    
        function __destruct()
        {
            $this->con = null;
        }
    }
    
    class myResult
    {
        private $mysqlAccess;
        private $prepared;
    
        public function __construct()
        {
            $this->mysqlAccess=new mysqlDigitalcog();
        }
    
        public function loadData1()
        {
            $sql="INSERT INTO W2_contact_us_FORM VALUES (:ID, :val1)";
            $this->prepared = $this->mysqlAccess->con->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
            $this->prepared->execute(array(':ID' => 1, ':val1' => 2))
        }
    
        public function loadData2($myArray)
        {
            $sql="INSERT INTO W2_contact_us_FORM VALUES (:ID, :val1)";
            $this->prepared = $this->mysqlAccess->con->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
            $this->prepared->execute($myArray)
        }
    }
    

    实际页面代码:

    $myResult=new myResult();
    $array=array(":ID" => 3, ":val1" => 4);
    
    $myResult->loadData1();
    // Data loaded with 1, 2 as per function.
    
    // or alternately
    
    $myResult->loadData2($array);
    // Data loaded with array contencts, here 3, 4
    

    现在,我们有一个包含两个函数的对象,一个是所有输入都在函数内部生成,另一个是值数组从外部传递给函数。

    【讨论】:

    • 非常感谢。如果您有时间,您能否使代码更加明确/防白痴?第一行应该是$prepared = '//your query',然后第二行正在运行吗?
    【解决方案2】:

    使用for循环插入'?'

    for(int i =0; i<26; i++)
    {
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2015-02-22
      相关资源
      最近更新 更多