我正在尝试将现有的MYSQL脚本转换为PDO。我的MYSQL脚本有效但我的PDO版本没有。
该脚本的目的是从TABLE调度中选择某些UID,其中UID是相同的,由相应的cif_stp_indicator的最低字母表字母选择。
例如,我试图找到UID号码'Y63553'。这个号码有两个UID。一个有一个'N'的cif_stp_indicator和一个有一个'O'的cif_stp_indicator。我希望选择带有STP指示符'N'
的UID如此示例数据............
cif_train_uid cif_stp_indicator Other Data
Y63553 N x
Z45789 O x
T78456 O x
Y63553 O x
我希望选择带有'N'的cif_stp_indicator的Y63553
以下MYSQL脚本实现了
$cif_stp_indicator=null;
$cif_train_uid='Y63553';
$b="SELECT s1.cif_train_uid,s1.cif_stp_indicator,s1.schedule_start_date
FROM schedule s1
LEFT JOIN schedule s2
ON (s1.cif_train_uid=s2.cif_train_uid AND s1.cif_stp_indicator>s2.cif_stp_indicator)
WHERE s2.cif_stp_indicator is NULL AND s1.cif_train_uid='$cif_train_uid' ";
$l=mysqli_query($mysql_link,$b);
if ($l) {
while($berths=mysqli_fetch_array($l,MYSQLI_ASSOC))
{
echo $berths['cif_train_uid'];
echo $berths['cif_stp_indicator'];
}
}
以下PDO脚本运行但没有结果。我确信它与NULL部分的配置方式有关,因为我可以通过删除脚本的相关部分让脚本显示Y63553的cif_train_uid。我从这个论坛获得了帮助,以便使用PDO脚本实现这一目标,现在只是试图理解为什么脚本的NULL部分无效。即不报告Y63553和N
$cif_stp_indicator=null;
$cif_train_uid='Y63553';
$sql="SELECT s1.cif_train_uid,s1.cif_stp_indicator,s1.schedule_start_date
FROM schedule s1
LEFT JOIN schedule s2
ON (s1.cif_train_uid=s2.cif_train_uid AND s1.cif_stp_indicator>s2.cif_stp_indicator)
WHERE s2.cif_stp_indicator is NULL AND s1.cif_train_uid=:s1_cif_train_uid ";
$movedata=$mysql_link->prepare($sql);
$movedata->bindValue(':s1_cif_train_uid',$cif_train_uid, PDO::PARAM_STR);
$movedata->execute();
$array=$movedata->fetchAll();
for($i=0;$i<sizeof($array);$i++){
echo $array[$i]['cif_train_uid'];
echo $array[$i]['cif_stp_indicator'];
}
连接代码
try
{
$mysql_link= new PDO("mysql:host=$servername;dbname=db;charset=utf8",$username,$password);
$mysql_link->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
$mysql_link->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
echo "Connected Success";
}
catch(PDOException $e)
{
echo $e->getMessage();
}
答案 0 :(得分:1)
foreach($movedata as $row2) {
echo $row2['cif_train_uid'];
echo $row2['cif_stp_indicator'];
}
使用PDO,你应该预先好像它是一个数组......或者数组中的fetchAll,然后像使用任何其他数组一样遍历它。
替代方案是:
$array = $movedata->fetchAll();
for($i=0;$i<sizeof($array);$i++) {
echo $array[$i]['cif_train_uid'];
echo $array[$i]['cif_stp_indicator'];
}
这是PDO和foreach的奇怪之处......它具有特殊功能......实用但令人困惑。