MySQL 查询适用于 PHPMyAdmin 但不适用于 PHP

Posted

技术标签:

【中文标题】MySQL 查询适用于 PHPMyAdmin 但不适用于 PHP【英文标题】:MySQL query works in PHPMyAdmin but not PHP 【发布时间】:2014-05-27 14:57:24 【问题描述】:

我不明白发生了什么。我在 php 中有一个查询崩溃 - 出现一个奇怪的错误 -。当我在 PHPMyAdmin 中复制/粘贴完全相同的请求时,它按预期工作。 我在这里做错了什么?

 SELECT oms_patient.id,
       oms_patient.date,
       oms_patient.date_modif,
       date_modif,
       AES_DECRYPT(nom,"xxxxx") AS "Nom",
       AES_DECRYPT(prenom,"xxxxx") AS "Prénom usuel",
       DATE_FORMAT(ddn, "%d/%m/%Y") AS "Date de naissance",
       villeNaissance AS "Lieu de naissance (ville)",
       CONCAT(oms_departement.libelle,"(",id_departement,")") AS "Lieu de vie",
       CONCAT(oms_pays.libelle,"(",id_pays,")") AS "Pays",
       CONCAT(patientsexe.libelle,"(",id_sexe,")") AS "Sexe",
       CONCAT(patientprofession.libelle,"(",id_profession,")") AS "Profession",
       IF(asthme>0,"Oui","Non") AS "Asthme",
       IF(rhinite>0,"Oui","Non") AS "Rhinite",
       IF(bcpo>0,"Oui","Non") AS "BPCO",
       IF(insuffisanceResp>0,"Oui","Non") AS "Insuffisance respiratoire chronique",
       IF(chirurgieOrl>0,"Oui","Non") AS "Chirurgie ORL du ronflement",
       IF(autreChirurgie>0,"Oui","Non") AS "Autre chirurgie ORL",
       IF(allergies>0,"Oui","Non") AS "Allergies",
       IF(OLD>0,"Oui","Non") AS "OLD",
       IF(hypertensionArterielle>0,"Oui","Non") AS "Hypertension artérielle",
       IF(infarctusMyocarde>0,"Oui","Non") AS "Infarctus du myocarde",
       IF(insuffisanceCoronaire>0,"Oui","Non") AS "Insuffisance coronaire",
       IF(troubleRythme>0,"Oui","Non") AS "Trouble du rythme",
       IF(accidentVasculaireCerebral>0,"Oui","Non") AS "Accident vasculaire cérébral",
       IF(insuffisanceCardiaque>0,"Oui","Non") AS "Insuffisance cardiaque",
       IF(arteriopathie>0,"Oui","Non") AS "Artériopathie",
       IF(tabagismeActuel>0,"Oui","Non") AS "Tabagisme actuel",
       CONCAT(nbPaquetsActuel," ","PA") AS "",
       IF(tabagismeAncien>0,"Oui","Non") AS "Tabagisme ancien",
       CONCAT(nbPaquetsAncien," ","PA") AS "",
       IF(alcool>0,"Oui","Non") AS "Alcool (conso régulière)",
       IF(refluxGastro>0,"Oui","Non") AS "Reflux gastro-oesophagien",
       IF(glaucome>0,"Oui","Non") AS "Glaucome",
       IF(diabete>0,"Oui","Non") AS "Diabète",
       CONCAT(patienttypeDiabete.libelle,"(",id_typeDiabete,")") AS "",
       IF(hypercholesterolemie>0,"Oui","Non") AS "Hypercholestérolémie",
       IF(hypertriglyceridemie>0,"Oui","Non") AS "Hypertriglycéridémie",
       IF(dysthyroidie>0,"Oui","Non") AS "Dysthyroïdie",
       IF(depression>0,"Oui","Non") AS "Dépression",
       IF(sedentarite>0,"Oui","Non") AS "Sédentarité",
       IF(syndromeDApneesSommeil>0,"Oui","Non") AS "SAS",
       IF(obesite>0,"Oui","Non") AS "Obésité",
       IF(dysmorphieFaciale>0,"Oui","Non") AS "Dysmorphie faciale",
       TextObservations AS "",
       id_user
FROM oms_patient
LEFT JOIN oms_departement ON oms_departement.id = id_departement
LEFT JOIN oms_pays ON oms_pays.id = id_pays
LEFT JOIN patientsexe ON patientsexe.id = id_sexe
LEFT JOIN patientprofession ON patientprofession.id = id_profession
LEFT JOIN patienttypeDiabete ON patienttypeDiabete.id = id_typeDiabete
WHERE oms_patient.id=1

您的 SQL 语法有错误;检查相应的手册 到您的 mysql 服务器版本,以便在附近使用正确的语法 'small">(conso régulière)", IF(refluxGastro>0,"Oui","Non") as "Reflux ga' 在第 1 行

"near 'small"

PHP 代码并不真正相关,因为您不会看到很多。

  $db = mysql_connect();
    mysql_select_db();//TODO SWITCH TO PDO
    mysql_query("SET NAMES UTF8");


    $fields = $form->getFields($form);
    $settingsForm = $form->getSettings();
    $sql = 'SELECT oms_patient.id,oms_patient.date,oms_patient.date_modif,';
    foreach ($fields as $field) 
        if (!$field->isMultiSelect()) 
            $field->select_full(&$sql, 'oms_patient', null);
        
    
    if (isset($settingsForm['linkTo'])) 
        $idLinkTo = 'id_' . str_replace('oms_', '', $settingsForm['linkTo']);
        $sql .= $idLinkTo;
    

    $sql.=' FROM oms_patient';
    foreach ($fields as $field) 
        if (!$field->isMultiSelect() && $field->getTable('oms_patient')) 
            $sql .=' LEFT JOIN ' . $field->getTable('oms_patient') . ' ON ' . $field->getTable('oms_patient') . '.id = '.$field->getFieldName().' ';
        
    
    $sql.=' where oms_patient.id=' . $this->m_settings['e'];

    $result = mysql_query($sql) or die('Erreur SQL !<br>' . $sql . '<br>' . mysql_error());
    $data = mysql_fetch_assoc($result);

$sql 的 var_dump

string(2663) "SELECT oms_patient.id,oms_patient.date,oms_patient.date_modif,date_modif,AES_DECRYPT(nom,"xxxxx") as "Nom",AES_DECRYPT("prenom","xxxxx") as "Prénom usuel",DATE_FORMAT(ddn, "%d/%m/%Y") as "Date de naissance",villeNaissance as "Lieu de naissance (ville)",CONCAT(oms_departement.libelle,"(",id_departement,")") as "Lieu de vie",CONCAT(oms_pays.libelle,"(",id_pays,")") as "Pays",CONCAT(patientsexe.libelle,"(",id_sexe,")") as "Sexe",CONCAT(patientprofession.libelle,"(",id_profession,")") as "Profession", IF"...

无法进一步查看“...”之后的输出内容

【问题讨论】:

你需要显示php版本,这里或那里一定有遗漏的报价 我不确定它是否会对您有所帮助,但在这里 var_dump($sql); 在你的$result-statement 之前的结果是什么? TODO SWITCH TO PDO 不应该是评论,但应该始终这样做:) 您确定您正在测试正确的文件吗?放一条退出语句,看看是不是那个。 【参考方案1】:

您的问题很可能是在 SELECT 字段中,您正在注入 html 标记。

我不知道这个函数的确切作用:$field-&gt;select_full(&amp;$sql, 'oms_patient', null);,但它很可能是附加包含 HTML 标记的字符串。

如果您执行var_dump($sql);,您将清楚地看到这一点,然后在您的浏览器中看到它后,执行右键单击->查看源代码。在源代码中,您将在查询之间看到 HTML 标记。

解决这个问题,你就会解决你的问题。

【讨论】:

完全正确!我感到羞耻.... '(conso régulière)", 附近使用正确语法的版本 那么是&lt;span中的&lt;造成了严重破坏。 给您带来问题的不是&lt;。这是第一个报价。错误消息明确指出near 'small"&gt;。通常错误之前的字符就是问题所在。如果是&lt;,则错误会显示near span class

以上是关于MySQL 查询适用于 PHPMyAdmin 但不适用于 PHP的主要内容,如果未能解决你的问题,请参考以下文章

为啥这种“嵌套连接”适用于 PDO 而不适用于 MySql cli?

如何使用 phpmyadmin 导出 MySQL 中的特定列?

类似于 PhpMyAdmin 的 PHP 通用 SQL 查询和结果

phpmyadmin 权限仅适用于某些数据库

类似 phpMyAdmin 但适用于 SQL Server 的东西? [关闭]

phpmyadmin 2002 错误,mysql.sock.lock 似乎取代了 mysql.sock 文件