Php 数据库项未显示在网页上
我正在使用PHP脚本,并通过PDO连接到数据库。数据库包含两个表:第一个是Php 数据库项未显示在网页上,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我正在使用PHP脚本,并通过PDO连接到数据库。数据库包含两个表:第一个是必需的\u项,另一个是捐赠 required\u items包含列:id,name,required\u amount 捐赠包含以下列:id,姓名,电子邮件,捐赠金额,项目id 下面是我正在使用的简单代码: <?php $pageName = "/donations/index.php"; $databaseHost = "localhost"; $databaseName = "donat
必需的\u项
,另一个是捐赠
required\u items
包含列:id
,name
,required\u amount
捐赠
包含以下列:id
,姓名
,电子邮件
,捐赠金额
,项目id
下面是我正在使用的简单代码:
<?php
$pageName = "/donations/index.php";
$databaseHost = "localhost";
$databaseName = "donations";
$databaseUser = "root";
$databasePassword = "pwd";
//TODO Check, validate, sanitize your input...
$name = $_POST['name'];
$email = $_POST['email'];
$donation_amount = $_POST['amount'];
$item_id = $_POST['radioButtons'];
try {
$db = new PDO('mysql:host=' . $databaseHost . ';dbname=' . $databaseName . ';charset=utf8', $databaseUser, $databasePassword);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch (PDOException $e) {
echo "Exception: " . $e->getMessage(); //TODO better error handling
}
// Check to see if someone wants to donate something
if(!empty($_REQUEST['donate']))
{
try {
//Construct your query with placeholders
$sql = "INSERT INTO donations (name, email, donation_amount, item_id) VALUES (?, ?, ?, ?)";
//Prepare your query
$query = $db->prepare($sql);
//Execute it passing parameters
$query->execute(array($name, $email, $donation_amount, $item_id));
echo("Thank you for donating!\n<br>\n<br>");
} catch (PDOException $e) {
echo "Exception: " . $e->getMessage(); //TODO better error handling
}
}
$request = "SELECT
required_items.id,
required_items.name,
required_items.required_amount - donations.donation_amount AS Amount_Left,
donations.item_id
FROM required_items JOIN donations ON donations.item_id=required_items.id";
$stmt = $db->query($request);
$item_info = $stmt->fetch();
// Round negative amounts to zero
if($item_info['Amount_Left'] < 0){
$item_info['Amount_Left'] = 0;
}
?>
<!--Print out the table tag and header-->
<form name="donationForm" action="<?php $pageName ?>" method="POST">
<fieldset>
<table>
<tr>
<th>Item Name</th><th>Amount</th>
</tr>
<tr>
<td><?php $item_info['name'] ?></td>
<td><?php $item_info['Amount_Left'] ?></td>
<td><input type="radio" name="radioButtons" value="<?php $item_info['item_id'] ?>"></input></td>
</tr>
</table>
<div><label>Amount</label><input type="number" name="amount"></div>
<div><label>Email</label><input type="email" name="email"></div>
<div><label>Name</label><input type="text" name="name"></div>
<div><input type="submit" name="donate" value="Donate"></div>
</fieldset>
</form>
如果要给表格添加别名,请尝试:
SELECT r.name AS Name ... FROM required_items AS r ...
PDO::query()返回PDO语句对象,因此需要执行以下操作:
$amount_left = $db->query("SELECT required_items.name AS Name, required_items.required_amount - donations.donation_amount AS Amount_Left
FROM required_items AS r JOIN donations AS d ON d.item_id=r.id")
->fetch(PDO::FETCH_ASSOC);
请避免过度工程化
$sql = "SELECT name, required_amount - donation_amount AS Amount_Left
FROM required_items JOIN donations ON item_id=id";
也可以为您服务
所有其他代码也是如此,它们过于臃肿,可以这样简化
$stmt = $db->query($sql);
$data = $stmt->fetch();
if($data['Amount_Left'] < 0) {
$data['Amount_Left'] = 0;
}
?>
<form name="donationForm" method="POST">
<fieldset>
<table>
<tr>
<th>Item Name</th>
<th>Amount</th>
</tr>
<tr>
<td><?=$data['name']?></td>
<td><?=$data['Amount_Left']?></td>
<td>
<input type="radio" name="radioButtons" value="<?=$row['id']?>">
</td>
</tr>
$stmt=$db->query($sql);
$data=$stmt->fetch();
如果($data['Amount_Left']<0){
$data['Amount_Left']=0;
}
?>
项目名称
数量
试试这个
$amount_left = $db->query("SELECT r.name AS Name, r.required_amount - d.donation_amount AS Amount_Left FROM required_items AS r JOIN donations AS d ON d.item_id=r.id");
因为您使用的是AS
,所以需要对相应的表使用r
和d
,不知道DB类,但是PHP代码是正确的。正如错误所说,您在required_items中似乎没有name列。name可能是一个保留字,请尝试required_items。`name`好的,这似乎可以工作,但现在我收到一个错误“不能将PDOStatement类型的对象用作数组”,在“try{”$amount_left是PDOStatement对象。您可以执行->获取”之后引用if语句(PDO::FETCH_ASSOC)得到array@user2766423是的,你不能。因为你用错了方法。我确实计划去掉所有的echo'd HTML,使其成为HTML。是的,我感谢你在这方面的帮助。我想让它先工作,但可读性会更好。这不是可读性,而是敏感性。这些无用的别名是错误的原因.