【问题标题】:Error while updating php form information into sql server databases将php表单信息更新到sql server数据库时出错
【发布时间】:2017-12-19 17:27:53
【问题描述】:

我在php中创建了表单,想更新sql server数据库中的数据。

以下是我的 ad.php 文件。

<html>
<title>FORM</title>
<body><br><br>
<form action ="db_connection.php" method="post">
Activity:<input type="text" name="name"><br><br>
Units: <input id="number"><br><br>

<input type="submit" value="submit">
</form>

上面表格中插入的数据应该在数据库的“ad”表中更新。

以下是我的 db_connection.php 文件:

<?php

class DB{
protected static $db;
const SERVER = "";
const SCHEMA = "";
const USER = "";
const PASS = "";
/*
 * Sets up the database connection
 * @return the database instance
 */
public static function databaseConnection(){
    if(!self::$db){
        try {

            $databse = "sqlsrv:server=" . self::SERVER . ";Database=" . self::SCHEMA;
            self::$db = new PDO($databse, DB::USER, DB::PASS);  
            self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
        } catch(PDOException $e){
            die("Error " . $e->getMessage());
        }   
    }
    return self::$db;
}

}


class ad{

  public function dbAdmin(vat $Activity, int $Units): bool {
    $conn = databaseConnection::getConnection();
    $conn->beginTransaction();
    $sql = "INSERT INTO ad('Activity', 'Units') VALUES (:Activity, :Units)";
    $stmt = $conn->prepare($sql);
    $stmt->bindParam(':Units', $Units);
    $stmt->bindParam(':Activity', $Activity);
    if ($stmt->execute()) {
        $conn->commit();
        return true;
    } else {
        $conn->rollback();
        return false;
    }
}
}

提交表单后我得到一个空白页,并且数据库没有随着提交的新数据而更新。 请您检查代码并帮助我进行更正。

【问题讨论】:

  • 开启错误报告,你会得到一个错误信息。仅供参考:databaseConnection 在您的 dbAdmin() 方法的开头未定义。
  • 检查您的网络错误日志。另外,我希望您有一个空白页面,因为一旦您发布到 db_connection.php ,我就看不到它在哪里写任何东西。

标签: php sql-server netbeans pdo insert-update


【解决方案1】:

我不得不使用 Docker 来重现这个。正在使用容器“microsoft/mssql-server-linux”。

I am using this extension **pdo_sqlsrv** and this driver https://breeto.id.au/2017/05/docker-alpine-linux-php-sql-server/

index.html

<!DOCTYPE>
<html>
<head>
    <title>FORM</title>
</head>
<body>
<br/>
<br/>
<form action="index.php" method="post">
    <label for="activity">Activity: </label>
    <input id="activity" type="text" name="activity">
    <br/>
    <br/>
    <label for="number">Units: </label>
    <input id="number" type="number" name="units">
    <br/>
    <br/>
    <input type="submit" value="submit">
</form>
</body>
</html>

index.php

<?php
declare(strict_types=1);

require_once __DIR__ . '/Db.php';
require_once __DIR__ . '/Ad.php';

error_reporting(E_ALL);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
ini_set('log_errors', '1');

$post = ['activity', 'units'];
if (!isset($_POST['activity'], $_POST['units'])) {
  header('Invalid form', TRUE, 422);
  exit;
}

$activity = filter_input(INPUT_POST, 'activity', FILTER_SANITIZE_SPECIAL_CHARS);
$units    = (int) filter_input(INPUT_POST, 'units', FILTER_SANITIZE_NUMBER_INT);
if (!is_int($units)) {
  header('A number must be given', TRUE, 422);
  exit;
}

$adTable = new Ad();
$adTable->dbAdmin($activity, $units);

echo '<h1>Done</h1>';
echo "<p>Activity: {$activity}</p>";
echo "<p>Units: {$units}</p>";

数据库.php

<?php
declare(strict_types=1);


/**
 * Class Db
 */
class Db {

  protected static $db;

  public const SERVER = 'mssql';

  public const SCHEMA = 'stackoverflow';

  public const USER = 'sa';

  public const PASS = '';

  /**
   * Sets up the database connection
   *
   * @return \PDO
   */
  public static function databaseConnection(): \PDO {
    if (!self::$db) {
      try {
        $dsn      = 'odbc:Driver={FreeTDS};Server=' . self::SERVER . ';Database=' . self::SCHEMA . ';Port=1433';
        self::$db = new PDO($dsn, DB::USER, DB::PASS);
        self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      } catch (PDOException $e) {
        die('Error ' . $e->getMessage());
      }
    }
    return self::$db;
  }
}

广告.php

<?php
declare(strict_types=1);


/**
 * Class Ad
 */
class Ad {

  public function dbAdmin(string $activity, int $units): bool {
    $conn = Db::databaseConnection();
    $conn->beginTransaction();
    $sql  = /** @lang TSQL */
      'INSERT INTO stackoverflow.dbo.ad (Activity, Units) VALUES (:Activity, :Units)';
    $stmt = $conn->prepare($sql);
    $stmt->bindParam(':Activity', $activity, PDO::PARAM_STR);
    $stmt->bindParam(':Units', $units, PDO::PARAM_INT);
    if ($stmt->execute()) {
      $conn->commit();
      return TRUE;
    }
    $conn->rollBack();
    return FALSE;
  }
}

SQL Server (Microsoft) 表

CREATE TABLE ad
(
  id       INT IDENTITY
    PRIMARY KEY,
  Activity VARCHAR(255),
  Units    INT
)
GO

【讨论】:

    【解决方案2】:

    您也必须将名称属性放入单位字段中......因为表单通过其字段名称提交......

    更正:-

    <html>
    <title>FORM</title>
    <body><br><br>
    <form action ="db_connection.php" method="post">
    Activity:<input type="text" name="name"><br><br>
    Units: <input id="number" name="number><br><br>
    
    <input type="submit" value="submit">
    </form>
    

    【讨论】:

      【解决方案3】:

      我不确定你到底想做什么,因为它是完全不完整的代码。

      1. 您的$_POST 数组在哪里?您如何以及在何处检索 POST 请求数据?
      2. dbAdmin 是您执行数据插入的方法,但是如何调用此方法?你在哪里实例化这个类并调用这个方法?
      3. 这里声明的vat 数据类型是什么dbAdmin(vat $Activity, int $Units) ??
      4. 您的 html 表单中缺少Unitsname 属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-01
        • 2021-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多