【问题标题】:mysqli_connect() expects parameter 1 to be string, array givenmysqli_connect() 期望参数 1 是字符串,给定数组
【发布时间】:2014-12-09 02:13:22
【问题描述】:

我对@9​​87654321@ 有疑问,希望参数是一个字符串,并且显然给出了一个数组

我有一个 php 文件,它将 mysqli_connect 信息从变量“userconnection.txt”写入文件

'localhost','root','','forum'

然后我有一个标准的 php connection.php 文件,其中添加了主机用户和密码的 userconnection.txt 文件。

<?php

$connectionlink = file('userconnection.txt');
$connection = mysqli_connect($connectionlink);

if (!$connection) {
    die('Connect Error: ' . mysqli_connect_error());
}

?>

它吐出错误:

Warning: mysqli_connect() expects parameter 1 to be string, array given in /Applications/XAMPP/xamppfiles/htdocs/forum/install files/connection.php on line 4 Connect Error:

【问题讨论】:

  • mysqli_connect($connectionLink[0], $connectionLink[1], $connectionLink[2], $connectionLink[3]);,这就解决了。 PHP 不会 eval 你从文件中读取的东西(想象一下,如果它会......),它只会构造一个数组
  • 如果要这样使用,首先需要explode$connectionlink[0]

标签: php arrays string mysqli


【解决方案1】:

问题符合$connection = mysqli_connect($connectionlink)。因为变量不是字符串(在这种情况下它是 '$connectionlink'),所以它会显示错误。 在我的情况下,我将其更改为 $connection = mysqli_query($connectionlink) 并解决了所有问题。

【讨论】:

    【解决方案2】:

    这不起作用,实际上存在安全风险。

    安全

    txt 文件可能通过某个 URL 从您的网站访问。知道该 URL(一点也不难)的攻击者可以获取该文件,并且现在拥有您的登录凭据。 将文件保存在您的 webroot 之外或更改它的扩展名和内容,以便它们不能公开使用。也许是一个 PHP 文件?

    错误

    你有两个问题。第一个是file 将文件的所有行作为单独的行而不是作为一个字符串返回。请改用file_get_contents

    无论如何,如果您这样做,您仍然会将所有三个参数都放在一个字符串类型的变量中。但是mysqli_connect 函数需要三个单独的变量,而不是一个。您可以使用explode 解决此问题。

    快速而肮脏的解决方案

    $filecontents = file_get_contents('userconnection.txt');
    $connectionvars = explode("," $filecontents);
    $connection = mysqli_connect($connectionvars[0], $connectionvars[1], $connectionvars[2]);
    
    if (!$connection) {
        die('Connect Error: ' . mysqli_connect_error());
    }
    

    更好但更复杂的解决方案

    使用您的连接变量创建一个 PHP 文件:

    <?php
    $DBHost = "host";
    $DBUser = "user";
    $DBPass = "pass";
    

    将您的连接文件更改为:

    <?php
    require("connectionsettings.php");
    $connection = mysqli_connect($DBHost, $DBUser, $DBPass);
    if (!$connection) {
        die('Connect Error: ' . mysqli_connect_error());
    }
    

    【讨论】:

      【解决方案3】:

      因为file函数的返回值是一个数组。说var_dump($connectionlink);

      如果您将参数存储在变量或常量中,那就更好了。使用 .php 代替 .txt,并包含该文件。

      例如:

      include('connection.php');

      $link = mysqli_connect(DB_HOST,DB_USER,DB_PASS,DB_NAME) or die("Error " . mysqli_error($link));

      在你的connection.php中

      <?php
      define('DB_HOST', 'localhost');
      define('DB_USER', 'username');
      define('DB_PASS', 'password of the user');
      define('DB_NAME', 'name of your database');
      

      【讨论】:

      • 常量在这种情况下有一个缺点。它们是……不变的。因此,如果您在某个时候想要添加第二个连接,您的方法将不再有效。只需使用普通的旧变量并根据需要在您的范围内使用该文件。
      • 是什么阻止您定义任意数量的常量? :) 如果您想要多个连接,则需要每次更改变量的值,或定义其他变量。有什么区别?
      • 不同之处在于,您不能对不同的设置文件使用相同的“连接数据库”功能两次,因为它使用相同的常量名称。
      • 这是关于设计的。您可以使用function myConnect($host, $user, $pass) {//...} ,然后传递常量。
      • 这只会将问题从函数内部转移到调用函数的位置。常量容易出现很多问题,因为它们缺乏灵活性和解耦性,与单例非常相似。它们有其用途,但恕我直言,这不是其中之一。但我想这已经超出了这个问题的范围。
      猜你喜欢
      • 2021-01-13
      • 2015-07-12
      • 2016-04-30
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多