【问题标题】:How to show all fields from a mysql table with PHP and str_replace如何使用 PHP 和 str_replace 显示 mysql 表中的所有字段
【发布时间】:2021-07-27 04:23:02
【问题描述】:

我正在建立一个系统,用于使用 PHP + MYSQL 和连接 API 向 whatsapp 发送消息。

我创建了一个提交表单,我在其中定义了一些模板,例如 {{name}}{{expiration}} >{{codeticket}} 我打算将这些嵌入在我的消息中的模板发送给在 MYSQL 用户表中注册的所有用户。

目标如下: 当向所有用户发送消息时,每个用户都会收到以下消息: 例如:*

你好{{name}}你好吗?以下是您的银行单据代码: {{codeticket}} 记住您需要按天付款 {{expiration}} 此致,数字支持。 *

为此,我创建了一个脚本,用于查询用户表中“活动”字段等于“0”且 ID 等于“3”的所有字段。

因此,我在 PHP 中创建了一个“while”循环以从 users 表中获取所有字段,然后将每个字段的变量放入 url 中以发送到 whatsapp。

不使用模板的代码示例如下所示:

$sql = "SELECT * FROM usuarios WHERE id_ma ='". $id_ma ."' AND ativo = '".$ativo."'";
$qr = mysqli_query($conn, $sql);
$cont = mysqli_num_rows($qr);

if ($cont > 0) {
    //I make a loop with while to go through the bank and set each defaulting user.

    while ($txt = mysqli_fetch_array($qr, MYSQLI_ASSOC)) {
        $tags = array();
        $tags['name'] = $txt['nome'];
        $tags['expiration'] = $txt['data_expira'];
        $tags['linkgrupo'] = $txt['link_canal'];
        $tags['product'] = $txt['nome_prod'];
        $tags['codebillet'] = $txt['codigo_boleto'];
        $tags['link_billet'] = $txt['link_boleto'];
        foreach ($tags as $key => $valor) {
            $conteudo_msg = str_replace('{{'.$key.'}}', $valor, $conteudo_msg);
        }

        //Here I take the query data and send the msg to users via APi Whatsapp
        $url = "https://send.zaprapido.com.br/api/send.php?token=".$apiwhatsapp."&no=55".$txt["celular"]."&text=".urlencode(utf8_decode($txt['nome']))."+";
        //echo $url."<br />";
        //Vamos chamar a msg via Json pela APi

        $result = file_get_contents($url, true);
        $data = json_decode(file_get_contents($url));

问题在于,当添加变量 $content_msg 以使用模板时,脚本只获取每个字段的第一行并将其发送到数据库中注册的所有号码。

【问题讨论】:

  • 当您在 url 中包含 $content_msg 变量时,您是否将其转义?
  • 你能在你的例子中显示你将在哪里添加$content_msg吗?
  • 你为什么使用utf8_decode?你知道这个函数的用途吗?
  • 您好,我正在使用 utf8_decode,因为我的数据库存在编码问题。当我以它注册的奇怪字符的形式输入任何内容时,utf8_decode 正是为了防止这些字符被发送给最终用户。

标签: php mysql str-replace


【解决方案1】:

每个while循环都需要将$conteudo_msg设置为模板,否则,它将具有previous的值,不会有{{key}}被替换。

...
$conteudo_msg = $template;
foreach($tags as $key => $valor)
{
    $conteudo_msg = str_replace('{{'.$key.'}}', $valor, $conteudo_msg);
}       
...

【讨论】:

    【解决方案2】:

    我不确定我是否理解您的问题,但您的代码中有错字。在您的$conteudo_msg 中有{{codeticket}},但在您的$tags 数组中,您有codebillet

    无论如何,我建议您只传入需要替换的变量,因为您在没有实际替换任何内容的情况下额外循环了 3 次。

    【讨论】:

    • 我在 $tags['codeticket'] 中的问题错了我添加了循环变量 $txt['codeticket'] 但是在 str_replace 中调用它时它只返回表的第一行,当我在第一行发送其他数字时,如果在循环内重复,看起来 PHP 无法显示与用户表中列出的每个数字对应的行。谢谢。
    • @dosiro 你不能希望有什么帮助:))
    • 伙计们,我在这里做了所有的测试。尽管我使用 str_replace PHP 将永远不会显示表中的所有数据。它总是只将表的第一行发送给所有用户。总之,我知道有解决办法,但是 str_replace 不可行。
    【解决方案3】:

    您的问题中缺少代码,但首先使用准备好的语句

    
     $template = "Hello {{name}} how are you? Below is your bank slip code: {{codeticket}} remembering that you need to pay by the day {{expiration}} Sincerely, Digital Support. *";
    
    mysqli = new mysqli("example.com", "user", "password", "database");
    
    $stmt = $mysqli->prepare("SELECT * FROM usuarios WHERE id_ma =? AND ativo =?");
    
    $stmt->bind_param("ss",$id_ma, $ativo);
    $stmt->execute();
    $result = $stmt->get_result();
    
    while($txt= $result->fetch_assoc()){
        $tags = array();
        $tags['name'] = $txt['nome'];
        $tags['expiration'] = $txt['data_expira'];
        $tags['linkgrupo'] = $txt['link_canal'];
        $tags['product'] = $txt['nome_prod'];
        $tags['codebillet'] = $txt['codigo_boleto'];
        $tags['link_billet'] = $txt['link_boleto'];
        
        foreach($txt as $key => $valor)
        {
            $conteudo_msg = str_replace('{{'.$key.'}}', $valor, $template);
        }
    }
    
    

    确实 txt 数组不是必须的,我们可以去掉它并使用 "as" 来获取正确的 assoc 结果数组...

    
    $template = "Hello {{name}} how are you? Below is your bank slip code: {{codeticket}} remembering that you need to pay by the day {{expiration}} Sincerely, Digital Support. *";
    
    mysqli = new mysqli("example.com", "user", "password", "database");
    
    $sql="SELECT 
           nome as name,
           data_expira as expiration,
           link_canal as linkgrupo,
           nome_prod as product,
           codigo_boleto as codebillet,
           link_boleto as link_billet, *
          FROM usuarios 
          WHERE id_ma=? AND ativo=?";
    
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param("ss",$id_ma, $ativo);
    $stmt->execute();
    $result = $stmt->get_result();
    
    while($tags = $result->fetch_assoc()){
        foreach($tags as $k => $v)
        {
            $conteudo_msg = str_replace('{{'.$k.'}}', $v, $template);
        }
    }
    
    
    

    【讨论】:

    • 您好,非常感谢您的贡献。它分部分工作。但我会看看我是否可以改进你发给我的逻辑。在我在这里测试它的情况下,它单独发送数据,但它在 foreach 内重复发送没有数据的文本。我的目的是创建一个表单 textarea 将这些模板 {{name}} 放在文本中,然后将其发送到 php 进行处理,并在表字段的 while 中替换,这样所有用户都会根据他们的注册收到这些数据。我们走在正确的道路上。从现在开始,上帝保佑你。
    • @SuporteWeb 发布更多代码,然后我可以更好地理解您想要做什么。发布一个新问题并提及我,或者改进这个问题。
    • 致命错误未捕获错误:调用 i.prntscr.com/SsbfcLohQNeMk6jTQha8Cg.png 中布尔值的成员函数 bind_param()
    • @SuporteWeb 需要查看第 16 行周围的行
    猜你喜欢
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    相关资源
    最近更新 更多