我在运行此代码时遇到问题:
<?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上的第一篇文章。我会回来的,但我会好起来的!
答案 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")';
}