1

ログインしたユーザーに、自分のページにある[マイアカウント]リンクの下にあるユーザーの情報のみを表示するにはどうすればよいですか?2つのテーブルの間に外部キーを設定してみました。1つはログイン用のテーブルで、もう1つは写真や情報を挿入するためのもので、写真の作成者をテーブルにあるユーザー名に関連付けますusers。私の目的は、ログインしているユーザーのユーザー情報と写真のみを表示することです。

問題は、外部キーを設定しようとすると外部キーが設定されますが、データがテーブルに入らないことです。写真をアップロードして情報を挿入したページには、アップロードが成功したことが示されていますが、データベースにアクセスしても何も表示されません。何か助けはありますか?私はこれで長い間立ち往生しています。

これが私がテーブルを作成するためにしたことです。

CREATE TABLE IF NOT EXISTS `users` (
`username` varchar(30) NOT NULL ,
`password` varchar(40) default NULL,
`usersalt` varchar(8) NOT NULL,
`userid` varchar(32) default NULL,
`userlevel` tinyint(1) unsigned NOT NULL,
`email` varchar(50) default NULL,
`timestamp` int(11) unsigned NOT NULL,
`actkey` varchar(35) NOT NULL,
`ip` varchar(15) NOT NULL,
`regdate` int(11) unsigned NOT NULL,
PRIMARY KEY  (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



CREATE TABLE IF NOT EXISTS photos (
ref int(10) unsigned NOT NULL auto_increment,
    photo varchar(75),
Firstname varchar(35),
    Lastname varchar(35),
    Age INT(3),
    author varchar(30) NOT NULL,
PRIMARY KEY (ref)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

これが、テーブルの作成後にFKを追加しようとしたものです。

ALTER TABLE photos
ADD CONSTRAINT FK_photos
FOREIGN KEY (author) REFERENCES users(username)
ON UPDATE CASCADE
ON DELETE CASCADE;

最後に、Upload.phpがあります

<?php
include("/include/session.php");
if(!$session->logged_in){ header("Location: ../main.php"); } else {
}
?>
<?php
$sub=0;

ini_set( "display_errors", 0);
if(isset($_REQUEST['submited'])) {
// your save code goes here

$allowedExts = array("jpg", "jpeg", "gif", "png");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 2097152)
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "";
if (file_exists("pictures/" . $_FILES["file"]["name"]))
{
echo "<font size='4' color='red'><b>We are sorry, the file you trying to upload already exists.</b></font>";
  }

else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"pictures/" . $_FILES["file"]["name"]);
$sub= 1;
$mysqli = new mysqli("localhost", "root", "", "secure_login");

// TODO - Check that connection was successful.

$photo= "pictures/" . $_FILES["file"]["name"];
$fname = $_POST["fname"];
$lname = $_POST["lname"];
$age   =$_POST["age"];
$stmt = $mysqli->prepare("INSERT INTO photos (photo, Firstname, Lastname, Age) VALUES (?, ?, ?, ?)");

// TODO check that $stmt creation succeeded

// "s" means the database expects a string
$stmt->bind_param("ssss", $photo, $fname, $lname, $age);

$stmt->execute();

$stmt->close();

$mysqli->close();



echo "<font size='7' color='white'><b> Success! Your Photo has been Uploaded.</b></font>";
echo '<meta http-equiv="refresh" content="2;url=home.php">';
}

}
}
else
{
echo "<font size='4' color='red'><b>We are sorry, the file you trying to upload is not an image or it exceeds 2MB in size.</b></font><br><font color='blue'><i>Only images under size of 2MB are allowed</i></font>.";
}
}


?>

<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="submited" value="true" />


<?php
ini_set( "display_errors", 0);
if($sub==0)
{
?> 
<label  for="file"><font  size="5"><b>Choose Photo:</b></font></label>
<input id="shiny" type="file" name="file" onchange="file_selected = true;" required><br>
First Name:<input  type="text" name="fname" value="<?php echo (isset($_POST['fname']) ? htmlspecialchars($_POST['fname']) : ''); ?>"required><br> 
Last Name:<input  type="text" name="lname" required><br> 
Age:<input type="text" name="age" required><br>
<input id="shiny" type="submit" value="Submit" name="submit">
<?php
}
?>


</form>
</div>

これはmain.phpページで、ユーザーがログインしたときにusenameが表示されます。

if($session->logged_in){
echo "<h1>Logged In</h1>";
echo "<table border='1' width='100%' bgcolor='red'>";
echo "<tr>";
echo "<td>";
echo "Welcome <b>$session->username</b>, you are logged in. <br><br>"
   ."[<a href=\"userinfo.php?user=$session->username\">My Account</a>] &nbsp;&nbsp;"
   ."[<a href=\"useredit.php\">Edit Account</a>] &nbsp;&nbsp;"; 
   echo "[<a href=\"upload.php\">Upload</a>]";
   echo "[<a href=\"test2.php\">My Uploads</a>]";



if($session->isAdmin()){
      echo "[<a href=\"admin/index.php\">Admin Center</a>] &nbsp;&nbsp;";
   }
   echo "[<a href=\"process.php\">Logout</a>]";
   }
   else{
   ?>
4

3 に答える 3

2

実際にユーザーIDをクエリに追加する必要があります。

$photo= "pictures/" . $_FILES["file"]["name"];
$fname = $_POST["fname"];
$lname = $_POST["lname"];
$age   =$_POST["age"];
$username = "?";//Add code here to get the username you are interested in
$stmt = $mysqli->prepare("INSERT INTO photos (photo, Firstname, Lastname, Age, author) VALUES (?, ?, ?, ?,?)");

// TODO check that $stmt creation succeeded

// "s" means the database expects a string
$stmt->bind_param("ssss", $photo, $fname, $lname, $age,$username);

ユーザー情報を取得するコードは表示されませんが、現在のクエリが次のようになっていると仮定します。

SELECT * FROM users WHERE username = 'someUser';

これを変更して写真を含めることができます(ユーザーが複数の写真を持つことができる場合のgroupbyは次のとおりです。

SELECT * FROM users u
LEFT JOIN photos p ON (p.author = u.username)
WHERE u.username = 'someUser'
GROUP BY u.username;
于 2013-01-22T00:22:05.603 に答える
0

author列に制約を設定し、それをnullにしないようにしました。photosこれは、テーブル内のすべてのレコードが入力されている必要authorがあり、この列の値が列内のusersテーブルに存在している必要があることを意味しますusername

INSERTクエリでは値を設定しauthorていないため、制約とテーブル定義()が原因で失敗しますNOT NULL

それを機能させるには、列が常に入力されていることを確認するauthorか、匿名アップロードを許可するためにnull可能にする必要があります。

于 2013-01-22T00:20:42.657 に答える
0

authorインサートにフィールドを設定する必要があります。外部キーの制約により、この値を持たない挿入の試行は失敗します。

また、MySQLエラーをチェックしてログに記録する必要があります。そうしていれば、外部キーの制約のために挿入が失敗することをすでに知っているでしょう。

于 2013-01-22T00:22:07.240 に答える