让表单处理程序工作时遇到问题

问题描述 投票:0回答:1

我总是从 $stmt->bind_param 或 $stmt->execute 中收到致命错误,我认为应该是与数据库的连接失败,但我似乎找不到问题。

这是我的 formhandler.php

<?php

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

if ($_SERVER["REQUEST_METHOD"] == "POST") {

  $nameSurname = htmlspecialchars($_POST["nameSurname"]);
  $zipcodeLocation = htmlspecialchars($_POST["zipcodeLocation"]);
  $streetAddress = htmlspecialchars($_POST["streetAddress"]);
  $phoneNumber = htmlspecialchars($_POST["phoneNumber"]);
  $email = htmlspecialchars($_POST["email"]);

  if (empty($nameSurname) || empty($phoneNumber)) {
    header("Location: ../index.php");
    exit();
  }

  try {
    require_once $_SERVER['DOCUMENT_ROOT'] . '/adressbuch/pages/adodbcon.php';

    $query = "INSERT INTO addressbuch (nameSurname, zipcodeLocation, streetAddress, phoneNumber, email) VALUES (?, ?, ?, ?, ?);";

    $stmt = $db->prepare($query);

    $stmt->bind_param("sssss", $nameSurname, $zipcodeLocation, $streetAddress, $phoneNumber, $email);
    $stmt->execute();

    $db = null;
    $stmt = null;

  } catch (mysqli_sql_exception $e) {
    die("MySQLi Error: " . $e->getMessage());
  }

  header("Location: ../index.php");
} else {
  header("Location: ../index.php");
}

这是我的 adodbd 连接:

<?php

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

require_once $_SERVER['DOCUMENT_ROOT'] . '/adressbuch/lib/adodb/adodb.inc.php';


$dbhost = 'localhost';
$dbusername = '***';
$dbpassword = '***';
$dbname='***';

$db = adoNewConnection('mysqli'); 
$db->debug = true;
$db->connect($dbhost, $dbusername, $dbpassword, $dbname);

这是我得到的具体错误:

致命错误:未捕获错误:在 /var/www/ch/kxa/ygy/adressbuch/pages/formhandler.php:31 中的字符串上调用成员函数bind_param() 堆栈跟踪:#0 {main} 抛出pages/formhandler.php 在线31

我已经多次更改代码,但似乎无法找到确切的问题。

php mysqli adodb-php
1个回答
0
投票

看起来好像您使用了一些在网上找到的代码并尝试将其与应用程序中的一些现有代码结合起来。你正在混合两种完全不同的东西,它们不能一起工作。 ADOdb 和 mysqli 不是同一件事。一个是 2000 年代初的 PHP 库,另一个是本机 PHP 扩展。

如果您的应用程序是使用 ADOdb 库编写的,您需要遵循他们的操作方式。他们的文档提供了一些关于如何按照自己的方式做事的简单指南:https://adodb.org/dokuwiki/doku.php?id=v5:userguide:learn_bind:bind_vars

我不知道为什么

prepare
返回一个字符串,但如果你这样做它应该可以工作:

$stmt = $db->prepare($query);
$result = $db->execute($stmt, [$nameSurname, $zipcodeLocation, $streetAddress, $phoneNumber, $email]);

另请确保删除

htmlspecialchars
,因为这会损坏进入数据库的数据。仅当在 HTML 上下文中显示某些内容时才应使用此函数。

并且请删除不必要的和多余的try-catch。如果您没有从异常中恢复的计划,则不应捕获它。

© www.soinside.com 2019 - 2024. All rights reserved.