PHP、Javascript、mysql和选择列表

4
我正在开发一款软件,它会从 mysql 数据库中获取信息,并将其动态地放入我们的表单中。不过,我遇到了一些问题。以下是一些功能的简要介绍。
表单加载时,我们有大量选择列表。这些通过带有各种键/值的 php 数组进行填充。当我从一个名为“客户”列表中选择一个选项后,在点击时,我需要检查该客户是否有一个特殊标志(存储在数据库中),并根据该数据更新另一个选择列表。
我理解我的解决方案的核心是需要在点击时触发 JavaScript,而我已经实现了。所调用的函数引用处理数据库查询的 php 页面中的类和其函数。
<script>
function setService() 
{   // The customer's "id" grabbed from the aforementioned customer selection list
    customer = $('#customer').val();
    $.get('thePage.php?key=setService?customer='+customer);
}
</script>

这个函数与我的php进行通讯。CustomerProvider类已经完全正常工作,我在其他页面上已经充分测试过了。问题出现在当我试图改变选择列表时。
<?
if(isset($_GET['key']) && $_GET['key'] == 'setService')
{
    $customer = $_GET['customer'];
    $customer = intval($customer);
    $s = CustomerProvider::getHasContract($customer);
    if ($s != '')
       { ?> <script>var element = document.getElementById('ticket_service');
          element.value = 'Contracted Hours';</script> <? }
    else return;
} 
?>

我第一次真正编写JavaScript代码,他们让我参与了这个项目。我知道我的部分没有按照我预期的方式输出HTML。我知道PHP的其他部分和JavaScript的前面部分似乎都在执行。非常感谢任何帮助。


这里的基本问题是你丢弃了$.get的结果,而没有将其应用到你的页面上。将服务器输出的代码移到JavaScript的回调函数中,以便进行元素更改。 - cyberbit
4个回答

4

你似乎已经在正确的轨道上了,但是为了你自己的心理健康,这里有几个提示。像这种情况下,你不应该从PHP返回Javascript。相反,你应该依靠Javascript promise来等待包含仅数据的响应并在值被返回后继续执行客户端代码的执行。看一下这个:

<script>
  function setService() { // The customer's "id" grabbed from the aforementioned customer selection list
    customer = $('#customer').val();
    $.get('thePage.php?key=setService?customer=' + customer, function(data) {
      console.log(data + ' was returned from your php script!');
      if(data.hasContract=='1')
          $('#ticket_service').val('Contracted Hours');
      else
          $('#ticket_service').val('No Contracted Hours');
    });
  }
</script>

然后你的PHP脚本将会像这样:
<?
if(isset($_GET['key']) && $_GET['key'] == 'setService')
{
    $customer = $_GET['customer'];
    $customer = intval($customer);
    $s = CustomerProvider::getHasContract($customer);
    if ($s != ''){
        $hasContract = 1;
    }
    else 
        $hasContract = 0;

    echo json_encode(array('hasContract' => $hasContract));
} 
?>

因此,只返回客户端应用程序继续所需的数据...而不是应用程序逻辑。

2
你的 PHP 需要一个 echo。 ;) - cyberbit
我理解你在这里所做的逻辑和应用,但它似乎并没有实际返回任何数据。我复制+粘贴了你给我的内容,并进行了调整以反映我需要获取的内容,在我的开发日志中,我得到了" was returned from your php script!"不确定我在这里搞砸了什么。 - dmcoding
我曾经遇到一个非常棘手的问题,但你必须解析返回的JSON数据,否则你会收到一个对象为空的错误。在你的JavaScript中简单地使用“JSON.parse(data)”就可以完美解决了。除此之外,感谢你的帮助。当有人指引你走向正确的方向时,这真是太好了。 - dmcoding
@dmcoding 没问题。我其实没有测试过那个脚本,如果还有其他奇怪之处,请告诉我;)您不应该在JavaScript中解析json。听起来您的内容标头应该在PHP中设置...因此,请在PHP文件的顶部添加以下内容以指定响应标头为JSON:header('Content-Type: application/json'); - r0m4n

0
这里的问题在于你没有使用服务器返回的结果。你的JavaScript可能确实是正确的,但浏览器永远不会看到或运行它。来自文档

Request the test.php page, but ignore the return results.

$.get( "test.php" );

尝试使用$.getJSON()快捷函数的以下代码。我写了两个版本,你可以在代码中看到注释。其中一个将确定合同状态的逻辑移入JS中。任何一个都应该可以工作。

PHP

<?
if(isset($_GET['key']) && $_GET['key'] == 'setService')
{
    $customer = $_GET['customer'];
    $customer = intval($customer);
    $s = CustomerProvider::getHasContract($customer);

    // Default output
    $output = array('hasContract' => false);

    // Customer has contract
    if ($s != '')
        $output['hasContract'] = true;

    echo json_encode($output)

    // Alternative: PHP just returns getHasContract, JS determines action
    // (this would replace $ouput, conditional, and echo)
    // echo json_encode(array("hasContract" => $s));
} 
?>

JavaScript

function setService() 
{   // The customer's "id" grabbed from the aforementioned customer selection list
    customer = $('#customer').val();
    $.getJSON('thePage.php?key=setService?customer='+customer, function(result) {
        // Alternative
        // if (result.hasContract != "")
        if (result.hasContract)
        {
            var element = document.getElementById('ticket_service');
            element.value = 'Contracted Hours';
        }
    });
}

0

你的代码没有对 PHP 脚本的输出进行任何处理。如果你想要将输出插入到 DOM 中的某个位置,应该使用 .load() 而不是 $.get

$("#someelement").load('thePage.php?key=setService?customer='+customer);

这将把输出放入<div id="someelement">中。如果输出包含<script>,则该脚本将被执行。

如果您知道结果只是一个脚本,那么您可以使用$.getScript()而不是$.get。然后输出应该只是Javascript,而不是像<script>这样的HTML标签包围。


0
正如其他人所写,您的代码没有使用GET变量。页面上不存在“ticket_service”元素,即使存在,该代码也不会对发送请求的页面产生影响。您应该打印/回显要显示/返回的结果,然后使用JS / Jquery进行操作。 由于我反对使用GET方法,支持更安全的POST方法,因此这里提供一个POST示例:

JS:

function postSomthing(customerID){
       $.post(
        'thePage.php',
        {key:'setService',customer:customerID},
        function(data){ 
         if(data!='x'){
         $('#ticket_service').val(data)
         }
         else{alert('no ticket');/*whatever you want to do*/}
        });
}

PHP(thePage.php):

if(isset($_POST['key']) && $_POST['key'] == 'setService'){
    $customer = intval($_POST['customer']);
    $s = CustomerProvider::getHasContract($customer);
    if ($s != ''){echo 'x';/* false, or whatever you want*/}
    else{echo 'Contracted Hours';}
} 

注意事项:

  • 您应该在前台页面上创建一个ID为“ticket_service”的元素,而不是在后台页面上创建。

具有id“ticket_service”的元素位于当前查看的页面上。调用我的php的javascript部分在我的元素显示之后。我之所以将thePage.php命名为这样,只是为了减少混淆。它的名称只是填充物,与加载顺序无关。 - dmcoding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接