在 PHP 中出现 odbc_prepare/执行的预准备语句插入错误


Prepared statement insertion error with odbc_prepare/execute in PHP

用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个更好的方法?但是,也许没有?感谢您的帮助!

编辑 - 考虑切换到PDO而不是ODBC,所以,如果你更熟悉使用PDO的解决方案,我对此非常满意,因为PDO现在似乎也内置于PHP中(希望如此)。

您可以使用命名参数,这至少会使其更容易阅读,但您仍然需要将所有 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

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

使用 for 循环插入"?"

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