28 Commits

Author SHA1 Message Date
71bd84dc03 debug sql 2025-03-12 19:37:53 +01:00
st
6ecf935961 füge Funktionen zum Senden von Problemen zur Troy-API hinzu und erweitere die Konfiguration 2025-03-11 14:19:06 +01:00
electronicfreak
560ef6589c add troy api 2024-04-04 19:53:41 +02:00
troy
e4a21f4d7c mail absender 2022-12-18 19:29:34 +01:00
troy
c2e488c8e7 added functional php mail 2022-12-18 19:04:18 +01:00
troy
59b5ffc82f mail return werte gesetzt 2022-11-12 11:25:42 +01:00
troy
2913f3f032 mail boundary auskommentiert 2022-11-12 11:22:56 +01:00
67a39afe0f Merge pull request 'feature/better-email' (#2) from feature/better-email into master
Reviewed-on: #2
2022-11-12 11:13:39 +01:00
troy
49ad1f2438 phpMailer eingebaut
also minimal
2022-11-12 11:10:59 +01:00
troy
7a596597da ungetestet, mail funktion verbessert 2022-11-11 14:41:11 +01:00
troy
0b7d47e816 better html emails 2022-11-11 13:20:20 +01:00
troy
6e7fd28762 sqal set mehr params 2022-10-28 17:15:53 +02:00
Sebastian Titz
756827d92b added google official 2022-09-23 07:21:14 +02:00
titz lapi
3f2c5c1e73 ip ban 2022-08-16 21:35:12 +02:00
troy
79e27ee95a no tabs 2022-07-22 23:30:10 +02:00
Sebastian Titz
af3d7d33a1 spam ip 2022-05-17 11:25:02 +02:00
Sebastian Titz
4636e50b25 und und oder vertauscht 2022-05-05 10:30:21 +02:00
troy
88f87e15b4 openmgraph und hotfix in string 2022-03-20 12:07:25 +01:00
Sebastian Titz
e44c10c5c2 auch keine crawler agents 2022-01-31 11:29:51 +01:00
troy
48bd8e66f2 Merge branch 'master' of https://git.seemsleg.it/pub/php-func-lib 2022-01-23 00:51:19 +01:00
troy
2e5b29bd9d so nun aber richtig 2022-01-23 00:51:10 +01:00
troy
b689d73065 warning gefixt wegen content type 2022-01-23 00:11:21 +01:00
troy
ff40210fb6 checkHuman 2022-01-22 11:52:53 +01:00
troy
209bb0b00c domain tipser 2022-01-09 15:15:20 +01:00
troy
6bec287363 die troy api 2022-01-09 13:27:20 +01:00
troy
b035d8c2d9 mj12bot 2021-11-27 09:56:12 +01:00
troy
17ced6d294 ip google und mj12 2021-11-27 09:51:13 +01:00
Sebastian Titz
4b54e14522 ln 2021-11-24 15:09:10 +01:00
10 changed files with 6924 additions and 215 deletions

View File

@@ -6,5 +6,6 @@ include_once ('string.php');
include_once ('numbers.php'); include_once ('numbers.php');
include_once ('mail.php'); include_once ('mail.php');
include_once ('debug.php'); include_once ('debug.php');
include_once ('troy-api.php');
// include_once ('markdown.php'); // include_once ('markdown.php');
?> ?>

View File

@@ -1,24 +1,43 @@
<?php <?php
$_ips_crawler = array ( $_ips_crawler = array (
'34.79.234.76', // google
'40.77.167.', // bing bot '40.77.167.', // bing bot
'54.36.148.', // ahrefbot
'54.36.149.', // ahrefbot
'66.249.', '66.249.',
'62.138.', '62.138.',
'62.210.149.60', '62.210.149.60',
'65.21.180.26', // seekport
'81.209.177.145', // website-datenbank.de
'85.25.177.', // abuse
'85.25.210.', // hosteurope abuse
'92.118.160.37', // netsystem research bot '92.118.160.37', // netsystem research bot
'104.155.85.', // google '104.155.85.', // google
'114.119.1', // petalbot '114.119.1', // petalbot
'185.191.171.', // semrush bot '144.76.15.153', // mj12bot
'207.46.13.', // bing bot '148.251.120.201', // mj12bot
'54.36.148.', // ahrefbot
'54.36.149.', // ahrefbot
'216.244.66.196', // opensiteexplorer
'65.21.180.26', // seekport
'81.209.177.145', // website-datenbank.de
'2a01:4f8:190:4244::2', // mj12bot
'192.99.5.225', // ...
'157.55.39.', // microsoft??? '157.55.39.', // microsoft???
'172.217.', //google
'176.125.230.38', //sql inj
'185.191.171.', // semrush bot
'192.99.5.225', // ...
'205.185.115.87', //sex spam
'207.46.13.', // bing bot
'216.58.', //google
'216.244.66.196', // opensiteexplorer
'2a01:4f8:190:4244::2', // mj12bot
'2a01:4f8:162:43c5::2', // mj12bot '2a01:4f8:162:43c5::2', // mj12bot
'85.25.177.', // abuse
'85.25.210.' // hosteurope abuse
); );
function checkHuman() {
global $_ips_crawler;
if (stripos ( $_SERVER ['HTTP_USER_AGENT'], 'bot' ) !== false || stripos ( $_SERVER ['HTTP_USER_AGENT'], 'crawler' ) !== false) {
return false;
}
foreach ( $_ips_crawler as $np ) {
if (startsWith ( $_SERVER ['REMOTE_ADDR'], $np )) {
return false;
}
}
return true;
}
?> ?>

View File

@@ -1,9 +1,14 @@
<?php <?php
function send_mail($an, $betreff, $text, $ok = '', $error = '') { function send_mail($an, $betreff, $text, $ok = '', $error = '') {
include 'secret.php'; global $absender;
$sender = 'noreply@troy-grunt.de'; $sender = 'noreply@troy-grunt.de';
if (isset ( $_sendermail )) { if(isset($absender) && $absender) {
$sender = $_sendermail; $sender = $absender;
}else{
include 'secret.php';
if (isset ( $_sendermail )) {
$sender = $_sendermail;
}
} }
$header = 'From: ' . $sender . "\r\n"; $header = 'From: ' . $sender . "\r\n";
$header .= 'To: ' . $an . "\r\n"; $header .= 'To: ' . $an . "\r\n";
@@ -18,3 +23,59 @@ function send_mail($an, $betreff, $text, $ok = '', $error = '') {
} }
} }
function send_html_mail($an, $betreff, $text, $ok = '', $error = '') {
global $absender;
$sender = 'noreply@troy-grunt.de';
if(isset($absender) && $absender) {
$sender = $absender;
}else{
include 'secret.php';
if (isset ( $_sendermail )) {
$sender = $_sendermail;
}
}
$boundary = md5($an.$betreff.$text.time());
$header = 'From: ' . $sender . "\n";
$header .= 'To: ' . $an . "\n";
$header .= 'Content-Type:multipart/alternative;boundary='.$boundary . "\n";
$header .= 'X-Mailer: PHP/' . phpversion ();
$content = "This is multipart message using MIME\n";
$content .= "--" . $boundary . "\n";
$content .= "Content-type: text/plain;charset=utf-8\n";
$content .= 'Content-Transfer-Encoding: 8bit' . "\n\n";
$content .= strip_tags($text)."\n\n";
$content .= "--" . $boundary . "\n";
$content .= "Content-type: text/html;charset=utf-8\n";
$content .= "Content-Transfer-Encoding: 8bit". "\n\n";
$content .= '<html><body>'.$text.'</body></html>'."\n\n";
if (mail ( $an, $betreff, $content, $header ) === true) {
echo $ok;
} else {
echo $error;
}
}
function send_php_mail($an, $betreff, $text, $ok = '', $error = '') {
global $_sendermail;
$sender = 'noreply@troy-grunt.de';
if (isset ( $_sendermail )) {
$sender = $_sendermail;
}
include 'php-mailer/PHPMailer.php';
$mail = new PHPMailer();
$mail->setFrom($sender);
$mail->addAddress($an);
$mail->Subject = $betreff;
$mail->msgHTML($text, __DIR__);
$mail->AltBody = strip_tags($text);
if (!$mail->send()) {
echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
echo 'Message sent!';
}
}
?>

15
og.php Normal file
View File

@@ -0,0 +1,15 @@
<?php
function scanOG($url) {
$og = array();
$html = file_get_contents($url);
$re = '/<meta (name|property)=("|\')(.*?)("|\').*?content=("|\')(.*?)("|\')/m';
preg_match_all($re, $html, $matches, PREG_SET_ORDER, 0);
foreach($matches as $m) {
$og[$m[3]] = $m[6];
}
//print_r($og);
return $og;
}
?>

5058
php-mailer/PHPMailer.php Normal file

File diff suppressed because it is too large Load Diff

1456
php-mailer/SMTP.php Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,12 +1,18 @@
<?php <?php
if (!defined('SQL_LOG')) define ( 'SQL_LOG', 1 ); // schreibt sql querys in eine log if (!defined('SQL_LOG')) define ( 'SQL_LOG', 1 ); // schreibt sql querys in eine log
$_m['host'] = 'localhost'; $_m['host'] = 'localhost';
$_m['user'] = ''; $_m['user'] = '';
$_m['pass'] = ''; $_m['pass'] = '';
$_m['data'] = ''; $_m['data'] = '';
$_m['pre'] = 'efcms2_'; $_m['pre'] = '';
$_m['salt'] = ''; $_m['salt'] = '';
$_sendermail = 'noreply@troy-grunt.de'; $_sendermail = 'noreply@.de';
$_smtp['srv'] = 'mail.seemsleg.it';
$_smtp['user'] = 'noreply@.de';
$_smtp['pw'] = '';
$_i['host'] = '';
$_i['secret'] = '';
?> ?>

395
sql.php
View File

@@ -1,192 +1,203 @@
<?php <?php
class SQL { $__idata = [];
private $h;
private $res = false; class SQL {
private $m; private $h;
public $salt; private $res = false;
public $pre; private $m;
public $cnt_get = 0; public $salt;
public $cnt_set = 0; public $pre;
public function __construct() { public $cnt_get = 0;
require_once ('secret.php'); public $cnt_set = 0;
public function __construct() {
$this->m = $_m; global $__idata;
$this->pre = $_m ['pre']; require_once ('secret.php');
$this->salt = $_m ['salt'];
if (SQL_LOG) $__idata = $_i;
$this->f = fopen ( 'sql.log', 'w' );
$this->m = $_m;
$this->h = new mysqli ( $_m ['host'], $_m ['user'], $_m ['pass'], $_m ['data'] ); $this->pre = $_m ['pre'];
if ($this->h->connect_errno) { $this->salt = $_m ['salt'];
return false; if (SQL_LOG)
} $this->f = fopen ( 'sql.log', 'w' );
return true;
} $this->h = new mysqli ( $_m ['host'], $_m ['user'], $_m ['pass'], $_m ['data'] );
public function get($que, $t = '', $p = array ()) { if ($this->h->connect_errno) {
// echo $que; return false;
$this->cnt_get ++; }
if (SQL_LOG) return true;
fputs ( $this->f, str_replace ( array ( }
"\n", public function get($que, $t = '', $p = array ()) {
" " // echo $que;
), array ( $this->cnt_get ++;
' ', if (SQL_LOG)
'' fputs ( $this->f, str_replace ( array (
), $que ) . "\n" . print_r ( $p, true ) . "\n\n" ); "\n",
$statement = $this->h->prepare ( $que ); " "
if (is_array ( $p )) { ), array (
switch (count ( $p )) { ' ',
case 0 : ''
break; ), $que ) . "\n" . print_r ( $p, true ) . "\n\n" );
case 1 : $statement = $this->h->prepare ( $que );
$statement->bind_param ( $t, $p [0] ); if (is_array ( $p )) {
break; switch (count ( $p )) {
case 2 : case 0 :
$statement->bind_param ( $t, $p [0], $p [1] ); break;
break; case 1 :
case 3 : $statement->bind_param ( $t, $p [0] );
$statement->bind_param ( $t, $p [0], $p [1], $p [2] ); break;
break; case 2 :
case 4 : $statement->bind_param ( $t, $p [0], $p [1] );
$statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3] ); break;
break; case 3 :
case 5 : $statement->bind_param ( $t, $p [0], $p [1], $p [2] );
$statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4] ); break;
break; case 4 :
case 6 : $statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3] );
$statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5] ); break;
break; case 5 :
case 7 : $statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4] );
$statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6] ); break;
break; case 6 :
case 8 : $statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5] );
$statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6], $p [7] ); break;
break; case 7 :
case 9 : $statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6] );
$statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6], $p [7], $p [8] ); break;
break; case 8 :
case 10 : $statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6], $p [7] );
$statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6], $p [7], $p [8], $p [9] ); break;
break; case 9 :
} $statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6], $p [7], $p [8] );
} else { break;
$statement->bind_param ( $t, $p ); case 10 :
} $statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6], $p [7], $p [8], $p [9] );
$statement->execute (); break;
}
$ret = array (); } else {
$statement->bind_param ( $t, $p );
// print_r($statement); }
if (isset ( $statement->error ) && $statement->error != '') { $statement->execute ();
if (SQL_LOG)
fputs ( $this->f, $statement->error ); $ret = array ();
return false;
} // print_r($statement);
$result = $statement->get_result (); if (isset ( $statement->error ) && $statement->error != '') {
// print_r($result); if (SQL_LOG)
while ( $row = $result->fetch_assoc () ) { fputs ( $this->f, $statement->error );
$ret [] = $row; return false;
} }
return $ret; $result = $statement->get_result ();
} // print_r($result);
public function single($que, $t = '', $p = array ()) { while ( $row = $result->fetch_assoc () ) {
$data = $this->get ( $que, $t, $p ); $ret [] = $row;
if ($data) { }
return $data [0]; return $ret;
} }
return false; public function single($que, $t = '', $p = array ()) {
} $data = $this->get ( $que, $t, $p );
public function list($que, $t = '', $p = array ()) { if ($data) {
$data = $this->get ( $que, $t, $p ); return $data [0];
if ($data) { }
$ret = array (); return false;
foreach ( $data as $d ) { }
foreach ( $d as $k => $v ) { public function list($que, $t = '', $p = array ()) {
$ret [] = $v; $data = $this->get ( $que, $t, $p );
} if ($data) {
} $ret = array ();
return $ret; foreach ( $data as $d ) {
} foreach ( $d as $k => $v ) {
return false; $ret [] = $v;
} }
public function keyval($que, $k, $v, $t = '', $p = array ()) { }
$data = $this->get ( $que, $t, $p ); return $ret;
if ($data) { }
$ret = array (); return false;
foreach ( $data as $d ) { }
$ret [$d [$k]] = $d [$v]; public function keyval($que, $k, $v, $t = '', $p = array ()) {
} $data = $this->get ( $que, $t, $p );
return $ret; if ($data) {
} $ret = array ();
return false; foreach ( $data as $d ) {
} $ret [$d [$k]] = $d [$v];
public function set($que, $t = '', $p = array (), $id = false) { }
// echo $que; return $ret;
$this->cnt_set ++; }
$statement = $this->h->prepare ( $que ); return false;
if (SQL_LOG) }
fputs ( $this->f, str_replace ( array ( public function set($que, $t = '', $p = array (), $id = false) {
"\n", // echo $que;
" " $this->cnt_set ++;
), array ( $statement = $this->h->prepare ( $que );
' ', if (SQL_LOG)
'' fputs ( $this->f, str_replace ( array (
), $que ) . "\n" . print_r ( $p, true ) . "\n\n" ); "\n",
if (is_array ( $p )) { " "
switch (count ( $p )) { ), array (
case 0 : ' ',
break; ''
case 1 : ), $que ) . "\n" . print_r ( $p, true ) . "\n\n" );
$statement->bind_param ( $t, $p [0] ); if (is_array ( $p )) {
break; switch (count ( $p )) {
case 2 : case 0 :
$statement->bind_param ( $t, $p [0], $p [1] ); break;
break; case 1 :
case 3 : $statement->bind_param ( $t, $p [0] );
$statement->bind_param ( $t, $p [0], $p [1], $p [2] ); break;
break; case 2 :
case 4 : $statement->bind_param ( $t, $p [0], $p [1] );
$statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3] ); break;
break; case 3 :
case 5 : $statement->bind_param ( $t, $p [0], $p [1], $p [2] );
$statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4] ); break;
break; case 4 :
case 6 : $statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3] );
$statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5] ); break;
break; case 5 :
case 7 : $statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4] );
$statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6] ); break;
break; case 6 :
case 8 : $statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5] );
$statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6], $p [7] ); break;
break; case 7 :
case 9 : $statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6] );
$statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6], $p [7], $p [8] ); break;
break; case 8 :
case 10 : $statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6], $p [7] );
$statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6], $p [7], $p [8], $p [9] ); break;
break; case 9 :
} $statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6], $p [7], $p [8] );
} else { break;
$statement->bind_param ( $t, $p ); case 10 :
} $statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6], $p [7], $p [8], $p [9] );
$statement->execute (); break;
if (isset ( $statement->error ) && $statement->error != '') { case 11 :
if (SQL_LOG) $statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6], $p [7], $p [8], $p [9], $p [10] );
fputs ( $this->f, $statement->error ); break;
return false; case 12 :
} $statement->bind_param ( $t, $p [0], $p [1], $p [2], $p [3], $p [4], $p [5], $p [6], $p [7], $p [8], $p [9], $p [10], $p [11] );
break;
if ($id) { }
return $statement->insert_id; } else {
} else { $statement->bind_param ( $t, $p );
return $statement->affected_rows; }
} $statement->execute ();
} if (isset ( $statement->error ) && $statement->error != '') {
function __destruct() { if (SQL_LOG)
if (SQL_LOG) fputs ( $this->f, $statement->error );
$this->h->close (); return false;
// echo 'DESTROY'; }
}
} if ($id) {
?> return $statement->insert_id;
} else {
return $statement->affected_rows;
}
}
function __destruct() {
if (SQL_LOG)
$this->h->close ();
// echo 'DESTROY';
}
}
?>

View File

@@ -35,11 +35,11 @@ function noScript($str) {
function random($name_laenge) { function random($name_laenge) {
$zeichen = "abcedfghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRTSUVWXYZ0123456789"; $zeichen = "abcedfghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRTSUVWXYZ0123456789";
$name_neu = ""; $name_neu = "";
@mt_srand ( ( double ) microtime () * 1000000 ); @mt_srand ( ( double ) microtime () * 1000000 );
for($i = 0; $i < $name_laenge; $i ++) { for($i = 0; $i < $name_laenge; $i ++) {
$r = mt_rand ( 0, strlen ( $zeichen ) - 1 ); $r = mt_rand ( 0, strlen ( $zeichen ) - 1 );
$name_neu .= $zeichen {$r}; $name_neu .= $zeichen[$r];
} }
return $name_neu; return $name_neu;
} }
@@ -49,7 +49,7 @@ function startsWith($haystack, $needle) {
} }
function endsWith($haystack, $needle) { function endsWith($haystack, $needle) {
$length = strlen ( $needle ); $length = strlen ( $needle );
return $length === 0 || (substr ( $haystack, - $length ) === $needle); return $length === 0 || (substr ( $haystack, - $length ) === $needle);
} }
function onlyAlpha($str, $zus = '') { function onlyAlpha($str, $zus = '') {
@@ -247,7 +247,7 @@ function onlySimpleHTML($s) {
'<pre>', '<pre>',
'<pre/>' '<pre/>'
), $s ); ), $s );
// cleanup // cleanup
$s = str_replace ( array ( $s = str_replace ( array (
'{{|-', '{{|-',
@@ -256,7 +256,7 @@ function onlySimpleHTML($s) {
'', '',
'' ''
), $s ); ), $s );
return $s; return $s;
} }
function linkify($input) { function linkify($input) {

82
troy-api.php Normal file
View File

@@ -0,0 +1,82 @@
<?php
function sendToTroy($data) {
$url = 'https://troy-grunt.de/api.php';
$options = array (
'http' => array (
'method' => 'POST',
'header' => array (
'Content-Type: application/json'
),
'content' => json_encode ( $data )
)
);
$context = stream_context_create ( $options );
return file_get_contents ( $url, false, $context );
}
function sendIssue($service, $text, $data = []) {
global $__idata;
$url = 'https://issues.troy-grunt.de/api';
// Basisdaten für den POST-Request
$postData = [
'host' => $__idata['host'],
'secret' => $__idata['secret'],
'typ' => $service,
'text' => $text,
'data' => json_encode($data) // Falls 'data' ein Array ist, wird es als JSON gesendet
];
// cURL initialisieren
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
// Anfrage senden & Antwort erhalten
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
//TODO
function sendSimpleIssue($text,$url){
$apiUrl = 'https://issues.troy-grunt.de/api/simple';
// Die notwendigen Daten
$data = [
'domain' => 'example.com', // Ersetze mit deiner registrierten Domain
'secret' => 'geheimes-passwort', // Ersetze mit deinem Secret
'text' => $text,
'url' => $url
];
$options = [
'http' => [
'header' => "Content-Type: application/json\r\n",
'method' => 'POST',
'content' => json_encode($data)
]
];
$context = stream_context_create($options);
$response = file_get_contents($apiUrl, false, $context);
if ($response === FALSE) {
die('Fehler bei der API-Anfrage');
}
// Antwort dekodieren
$result = json_decode($response, true);
if (isset($result['success']) && $result['success']) {
echo "Issue erfolgreich erstellt. ID: " . $result['issue_id'];
} else {
echo "Fehler: " . ($result['error'] ?? 'Unbekannter Fehler');
}
}//TODO nutzen
?>