PHP函数范围问题

时间:2014-08-21 22:24:07

标签: php mysqli

函数中的变量范围存在问题,代码不止于此,但我试图简化以便能够轻松解释问题。

<?php
//simply connecting to a database with mysqli
$server='localhost';
$user='root';
$password='';
$database='mydatabase';

$mylink = mysqli_connect($server, $user, $password, $database);

// a simple function to add two fields to a table
function addpost($userid, $post){
$sql = "INSERT INTO posts (user_id, post) VALUES ('$userid', '$post')";
$result = mysqli_query($mylink, $sql;
echo "done";
}

//assign values to be inserted into the table
$userid = 4;
$followerid = "This is the post";
//call the function and pass arguements
add_post($userid, $followerid);

?>

我反复遇到以下错误

  

注意:未定义的变量:C:\ xampp \ htdocs \ practice \ xyz.php中的mylink   第13行

     

警告:mysqli_query()期望参数1为mysqli,null给定   在第13行的C:\ xampp \ htdocs \ practice \ xyz.php

问题显然是addpost函数不知道$ mylink。我显然可以简单地将代码移动到数据库连接到函数中,但我认为这不是正确的方法。我究竟做错了什么?请提前帮忙

3 个答案:

答案 0 :(得分:2)

// a simple function to add two fields to a table
function addpost($userid, $post){
  $sql = "INSERT INTO posts (user_id, post) VALUES ('$userid', '$post')";
  $result = mysqli_query($mylink, $sql);
  echo "done";
}

您的问题在于此功能。 function关键字有效地向解释器说“这是我想要命名以供以后使用的一段代码”。此函数内的代码不知道在函数外声明的变量。

因为$mylink在此函数中声明为no,所以当您尝试使用它时,php会替换null。您正在调用的函数mysqli_query不会接受第一个参数的null输入。

有两种解决方法,第一种方法是将$mylink作为参数添加到此函数并传入。或者,您可以使用global关键字(请参阅here ),虽然这往往导致意大利面条代码。

function addpost($userid, $post, $mylink){
   //your code
}

addPost($userid, $post, $mylink);

或者:

function addpost($userid, $post){
  global $mylink;
    //your code
}

后者被认为是脆弱的,因为这个函数与它所依赖的函数(特定名称的全局声明变量)之间没有明显的联系。此外,您可能遇到命名空间问题(假设两个地方修改了一个名为$mylink的东西;您可以轻松地推断出调用函数时的范围吗?)。

答案 1 :(得分:1)

您可以将$ mylink作为参数传递给函数。

$server='localhost';
$user='root';
$password='';
$database='mydatabase';

$mylink = mysqli_connect($server, $user, $password, $database);

// a simple function to add two fields to a table
function addpost($userid, $post, $mylink) {
  $sql = "INSERT INTO posts (user_id, post) VALUES ('$userid', '$post')";
  $result = mysqli_query($mylink, $sql;
  echo "done";
}

// then call it
addpost($userid, $post, $mylink);

答案 2 :(得分:0)

两件事

值应为

VALUES('". $variable1 ."', '". $variable2. "');";

您不能像常规字符串那样引用sql查询中的变量。他们很特别。此外,您在查询结束时缺少分号。请注意我这样做了。

);";

第一个分号用于查询,第二个分号用于php。

第二,你错过了a)

$result = mysqli_query($mylink, $sql;\

应该是

$result = mysqli_query($mylink, $sql);

希望这会有所帮助,欢迎来到stackoverflow!