【问题标题】:Strange problem with mysql_connect and mysql_selectdb not taking some variables as argumentsmysql_connect 和 mysql_selectdb 的奇怪问题没有将某些变量作为参数
【发布时间】:2023-03-30 06:37:01
【问题描述】:

我在我协助的 PHP 课程中编写了一些代码,在 LAMP 环境中工作,并且没有问题。课程结束后,我把我的代码带回家并在 WAMPServer 上运行它,但由于某种原因,mysql_connect 不接受某些变量作为参数。我知道这一点,因为我尝试手动将参数提供给 mysql_connect 并且连接有效。另外,我回显了所有四个变量,它们都打印出来了。

我是 PHP 新手,但这对我来说没有任何意义。

代码:

functions.php

 <?php

require ("config.php");
     function conectardb () { 
     mysql_connect ($server, $login, $pass);
     mysql_select_db ($db);
 }

?>


config.php

<?php
 $login = "root" ;
 $pass = "" ;
 $server = "localhost";
 $db = "testing";
?>

我尝试将普通参数一个一个地替换为它们的变量,并发现代码在这一点上仍然有效:

 function conectardb () { 
     mysql_connect ($server, "root", $pass);
     mysql_select_db ("testing");
 }

如果我使用 $login 或 $db,连接将无法正常工作。有任何想法吗?这让我发疯了。

【问题讨论】:

    标签: php mysql wamp


    【解决方案1】:

    这是对 PHP 中作用域的误解。

    函数存在于它们自己的范围内。您在与函数不同的范围内定义了$login$pass 等。该函数无法访问它们,它看不到它们。

    您可以对此做几件事:

    1. 将数据库连接参数定义为常量而不是变量
    2. 在函数内部定义变量(需要函数内部的配置文件也一样)
    3. 使用global关键字将它们从全局作用域拉到函数作用域中

    $bar = 'hello world';
    function foo() {
        global $bar;
        echo $bar;
    }
    

    【讨论】:

    • 太棒了!!其他答案也是有效的,但由于这是第一个我将在这里评论:我怀疑这样的事情,但不明白为什么 $pass 和 $server 工作。有任何想法吗??我将 require 放在函数中并且它起作用了,但我仍然想知道为什么。另外,哪一个选项是最好的(我的意思是在“最佳实践”的意义上)?
    • @0al0:典型,因为这些在整个应用程序中都被视为常量,因此习惯上使用define() 来获取服务器信息(例如数据库名称、用户名、密码)。
    • @0al0 如果您不给mysql_connect 提供主机名,它只会“起作用”,它会自行尝试localhost,而您实际上有一个空密码。没有什么真正起作用,您实际上并没有传递任何变量,它们是空的,空虚等于您的情况的实际设置。
    • 谢谢丹,很有道理
    【解决方案2】:
    require ("config.php");
    function conectardb () 
    { 
        global $server, $login, $pass, $db;
        mysql_connect ($server, $login, $pass);
        mysql_select_db ($db);
    }
    

    这应该可以解决问题,因为变量是在不同的范围内定义的。但是,我建议将需要的值作为参数传递。

    function conectardb ($server, $login, $pass, $db) 
    { 
        mysql_connect ($server, $login, $pass);
        mysql_select_db ($db);
    }
    

    【讨论】:

      【解决方案3】:

      你的问题是变量范围。

      与大多数语言不同,php 不会自动知道函数外部定义的变量。要访问这些,您需要在函数中将它们指定为 global $server, $pass, $db;,或使用 $_GLOBALS[] 变量。

      请看:

      【讨论】:

        【解决方案4】:

        @David Kuridža 我建议不要使用 mysql_ 组件并使用默认包含这两个组件的 mysqli 或 PDO 扩展。

        【讨论】:

        • 实现您的声誉还不允许 cmets,这不适合作为“答案”帖子。您的评论是有效的,但请不要发布离题的 cmets 作为答案。
        • 同意,但问题是为什么上面的代码不起作用,并且由于 0al0 说他/她是从 PHP 开始的,所以解释范围和参数是合适的。在我看来,没有必要在答案中添加 PDO。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多