创建的类不会运行查询

时间:2013-12-24 15:11:02

标签: php class mysqli

我在运行此代码时遇到问题:

<?php
include_once "global.php";

class Project{
   //Variable declarations
   public $name;
   public $pm;
   public $members;
   public $details; 
   //Not sure if dates are necessary yet
   //$startDate = $inStartDate;
   //$endDate = $inEndDate;

   //Define the constructor
   function __construct($inName, $inPm, $inMembers, $inDetails){
       $this->name = $inName;
       $this->pm = $inPm;
       $this->members = $inMembers;
       $this->details = $inDetails;

       //Not sure if dates are necessary yet
       //$startDate = $inStartDate;
       //$endDate = $inEndDate;
   }

   //Function to create the Project within the database
   public function createProject(){
        echo "starting";

        //Initiate database connection, checking for errors 
        $con = dbConnect();

        if ($con->connect_errno){
            echo "Connect failed: %s\n". $mysqli->connect_error;
            exit();
       }

       //Insert the project into the projects database using the information used to instantiate
       if ($stmt = $con->prepare("INSERT INTO projects (name, details) VALUES (?,?)")){
            echo "Not getting here.";

            $stmt->bind_param('ss', $this->name, $this->details);
            $stmt->execute();

            if (strlen($stmt->error) > 0){
                return "Error creating project. Contact system administrator.";
            }

            elseif(count($members) == 0) {

                    //ensure there are members to enter
                    $last_insert = mysqli_insert_id($con);
                    $con->query('INSERT INTO project_member (pid,uid,rid) VALUES ('.$last_insert.','.$this->pm.',1');
                    exit();
                }

            else{
                //get last inserted ID
                $last_insert = mysqli_insert_id($con);
                echo $last_insert;
                //loop through members and create sql array
                $sql = array();
                foreach ($members as $user){
                    $sql[]='("'.$last_insert.','.$user.',0")';
                }
                //Add members to join table with roles
                $con->query('INSERT INTO project_member (pid,uid,rid) VALUES '.implode(',', $sql));

                $con->query('INSERT INTO project_member (pid,uid,rid) VALUES ('.$last_insert.','.$this->pm.',1');

                return true;
            }

            $stmt->close();
        }   
    }

}

它将进入mysqli代码循环,但不启动它。尝试从它回显导致没有提交任何内容,并且PHP错误日志不会记录任何事情。我也没有在MySQL日志上看到任何奇怪的东西。

$ members变量将是一个由整数组成的数组,这就是它在数组底部循环的原因。

我没有收到任何连接错误,并且在尝试捕获错误后回显导致成功。

dbConnect()来自上面的global.php文件,并返回一个mysqli连接。这是连接的内部:

function dbConnect(){
    $con = mysqli_connect($_HOST, $_DBUNAME, $_DBPASS,$_DBTABLE);
        if ($con->connect_errno){
            printf("Connect failed: %s\n", $mysqli->connect_error);
            return false; 
        }
        return $con; 
    }

我在我的网站上的其他地方使用过,并且在很多相同的情况下。不知道我在这里做错了什么,但任何建议将不胜感激。

编辑:我确实再次尝试了上述所有建议,并且仍然遇到了一个奇怪的问题,它不想通过if循环。

编辑2:没关系,我是个白痴。

问题是我的数据库中的“详细信息”行不存在。相反,在我的无限智慧中,我称之为描述并且没有更新代码。改变它修复了这个问题。

再次感谢大家在StackOverflow上的第一篇文章。我会回来的,但我会好起来的!

3 个答案:

答案 0 :(得分:2)

这个循环:

            foreach ($members as $user){
                $sql='("'.$last_insert.','.$user.',0")';
            }

应该是:

            foreach ($members as $user){
                $sql[]='("'.$last_insert.','.$user.',0")';
            }

您只是用字符串覆盖变量,而不是附加到数组。

我很惊讶下一行implode(',', $sql)没有报告错误。

答案 1 :(得分:1)

您将$sql初始化为数组,但随后为其分配一个字符串;您需要以不同方式向数组添加项目:

$sql = array();
foreach ($members as $user){
    $sql[] ='("'.$last_insert.','.$user.',0")';
}

注意方括号 - 为$sql数组添加额外项目。

我还会看一下你最后运行的两个查询:

$con->query('INSERT INTO project_member (pid,uid,rid) VALUES '.implode(',', $sql));

$con->query('INSERT INTO project_member (pid,uid,rid) VALUES ('.$last_insert.','.$pm.',1');

您要在同一个表中添加两组值 - $pm永远不会定义。你有$pm作为类变量,但是你没有这样设置它。其语法如下:

function __construct($inName, $inPm, $inMembers, $inDetails){
    $this->name = $inName;
    $this->pm = $inPm;
    $this->members = $inMembers;
    $this->details = $inDetails;

这意味着其余的类函数可以将这些变量作为$this->name访问,依此类推。

答案 2 :(得分:1)

问题始于您的项目constructor

您初始化$name, $pm, $members, $details的方式是将它们保持在constructor的本地。您想使用$this初始化这些变量。

//Define the constructor
function __construct($inName, $inPm, $inMembers, $inDetails){
    $this->name = $inName;
    $this->pm = $inPm;
    $this->members = $inMembers;
    $this->details = $inDetails;
}

然后,您可以安全地摆脱函数中定义的所有global变量,其中一些变量包括:

    global $name;
    global $details;
    global $members;

最后,您需要使用以下命令访问成员变量name, pm, members, details和其他任何变量:

$this->name, $this->pm, and so on

最后,正如其他回答者已经指出SQL字符串生成。

  $sql = array();
  foreach ($members as $user){
    $sql[] = '("'.$last_insert.','.$user.',0")';
  }