How to create a hyperlink with parameters using DOM in PHP? - php

I am trying to create a hyperlink using DOM in this way:
//create a hyper link
$hyperlink = $dom->createElement('a',$info[0][id]);
$url = $dom->createAttribute('href');
$url->value="http:/mydomain.com/index.php?type=users&user_id=1";
$hyperlink->appendChild($url);
But the hyperlink doesn't work.
When I remove the parameters
?type=users&user_id=1
then it works fine.
How should I pass those parameters to the hyperlink properly?

I resolved this issue using #Perry's suggestion by adding the parameters to the url using CDATASection
$param = $dom->createCDATASection('?type=users&user_id=1');
$url->appendChild($param);

Related

Avoid URL transform with PHP

I´m having issues with a link that is created in a php controller (Yii Framework). The link must be like this: https://example.com/track/?id=HDkuY0je9d (HDkuY0je9d is a tracking code) but when the view is rendered i get https://example.com/track/?id=h-dku-y0je9d
PHP is adding dash delimited automatically.
$trackcode = $val['tracking'];
$url_tracking = Yii::app()->createUrl("/track/?id=".$trackcode);
$tracking = 'Tracking';
If you are using Yii2 in this, it has helper class for create url and url must have been
$url_tracking = yii\helpers\Url::to(['/track','id'=>$trackcode]);
and for generate link
<?=\yii\helpers\Html::a('Link description',$url_tracking,['target'=>'_blank']) ?>
Thanks, I solved changing the way i get app url. Changed
$url_tracking = Yii::app()->createUrl("/track/?id=".$trackcode);
for
$url_tracking = websiteUrl()."/track/?id=".$trackcode;

How do I strip the url of a google news json feed link

How do I strip the url of a google news json feed link?
My link looks like this
http%253A%252F%252Fwww.boston.com%252Fbusiness%252Fnews%252F2014%252F12%252F04%252Fnasa-poised-usher-new-era-with-orion-launch%252FGOh9asOZiRJPHbNw60otUK%252Fstory.html
I have used the following code
strip_tags("".$row['url']."");
This does not do anything, I'm guessing this is possible and I am using the wrong php function.
You can use urldecode for this.
$url = "http%253A%252F%252Fwww.boston.com%252Fbusiness%252Fnews%252F2014%252F12%252F04%252Fnasa-poised-usher-new-era-with-orion-launch%252FGOh9asOZiRJPHbNw60otUK%252Fstory.html";
$url = urldecode(urldecode($url));
echo $url; // Will output: http://www.boston.com/business/news/2014/12/04/nasa-poised-usher-new-era-with-orion-launch/GOh9asOZiRJPHbNw60otUK/story.html

Usings $_GET to loop through a feed and find the right data

Im trying to set a working variable i can use later on in my code, ive got an id in the url that references an attribute in an external data feed. You can see a copy of the xml feed HERE
the id comes in the url like this - /page.php?id=52115351
At the moment im setting my working variable as bellow, buts its just being set to the first instance of 'market' rather than being set against the instance thats got the same id as the one in the url.
$wh_odds = $wh_xml->response->williamhill->class->type->market->participant;
$wh_odds_attrib = $wh_odds->attributes();
$wh_odds_attrib['name'];//name
How would i implement $_GET['id'] with this block so that it would be making the working variable $wh_odds_attrib['name'] from the participant of the correct instance of 'market' in the xml feed ?
If you're using simpleXML you could try something like this:
$simpleXml = simplexml_load_file('test.xml');
$marketNode = $simpleXml->xpath("/oxip/response/williamhill/class/type/market[#id='{$_GET['id']}']");
$attributes = $marketNode[0]->participant->attributes();
echo $attributes['name'];
I am not entirely sure what you are attempting to do but you can just assign the $_GET['id'] to whatever you want, ie $id = $_GET['id'] allowing you to use it in string manipulation (via sprintf or whatever).
A little more information about what you are trying to do, would help

Multiple $_GET through links

I'm doing a website. There's a pagination, you click on links and they take you to the page you need, the links pass $_GET variable ( a href="?pn=2" ) and that works fine.
However when i add the category links (also contain $_GET variable
(a href="?sort=english") on the same page, which kind of sort the content on the page, and click it, the system simply overrides the url and deletes all the previous $_GET's.
For example, I'm on page 2 (http://website.com/index.php?pn=2)
and then I click this sorting link and what I'm expecting to get is this (http://website.com/index.php?pn=2&sort=english), but what I get is this:
(http://website.com/index.php?sort=english). It simply overrides the previous $_GET, instead of adding to it!
A relative URI consisting of just a query string will replace the entire existing query string. There is no way to write a URL that will add to an existing query. You have to write the complete query string that you want.
You can maintain the existing string by adding it explicitly:
href="?foo=<?php echo htmlspecialchars($_GET['foo']); ?>&bar=123"
Try using this:
$_SERVER['REQUEST_URI'];
On this link you can see examples. And on this link I have uploaded test document where you can try it yourself, it just prints out this line from above.
EDIT: Although this can help you get the current parameters in URL, I think it's not solution for you. Like Quentin said, you will have to write full link manually and maintain each parameter.
You could create a function that will iterate through your $_GET array and create a query string. Then all you would have to do is change your $_GET array and generate this query string.
Pseudocode (slash I don't really know PHP but here's a good example you should be able to follow):
function create_query_string($array) {
$kvps = array();
for ($key in $array) {
array_push($kvps, "$key=$array[$key]");
}
return "?" . implode("&", $kvps);
}
Usage:
$_GET["sort"] = "english";
$query_string = create_query_string($_GET);
You need to maintain the query parameters when you create the new links. The links on the page should be something like this:
Sort by English
The HTTP protocol is stateless -- it doesn't remember the past. You have to remind it of what the previous HTTP parameters were via PHP or other methods (cookies, etc). In your case, you need to remind it what the current page number is, as in the example above.

PHP Query String Manipulation

I have a small issue with manipulating the current URL query string to add an extra parameter at the end.
Per example, say there's a category layout for products, the URL would be:
index.php?category=3&type=5
Now, on that page I have a link for a layout that is either a table or a grid. In those URLs I currently have:
<a href="index.php?<?php echo preg_replace($array,'',$_SERVER['QUERY_STRING']); ?>&layout=grid" ...
Then, I do the same for the table href as well. Also in my array I have just:
$array = array ( '/&layout=table/', '/&layout=grid/' )
Is this the right way, or is there a better way for doing this? I'm asking because without preg_replace, it will continue adding that same layout parameter everytime it is clicked, so it will also show the previous parameter, then the next, then the next.. without removing the previous layout parameters.
Any insight on this will be much appreciated.
EDIT:
Thanks to the answers below, I have created a little function:
function buildQuery($key,$value) {
$params = $_GET;
$params[$key] = $value;
return http_build_query($params);
}
Then its only a matter off:
grid
this might seem pointless but i like to have my view / template files without the extra set vars. Im a clean freak. I might even return the 'index.php?' with it just so i can be more lazy, anyways something to play with now :)..
If you want to modify the query string, it's easier to simply modify the GET variables and rebuild the query string:
$params = $_GET;
$params['layout'] = 'new_layout';
Then:
...
Although you could also do:
...
Think about directly parsing the $_GET paramaters to build your url.
I think what you want to do is have the link going to index.php with all the same parameters as you have at the moment, but changing layout to grid. I'd suggest you do something like this:
<?php
// make a copy of the $_GET array with all the parameters from the query string
$params = $_GET;
// set layout=grid regardless of whether layout was set before or its value
$params['layout'] = 'grid';
// generate a query string to append to your urls.
// Note that & is used as the arg separator; this is necessary for XHTML and advised for HTML
$queryString = http_build_query($params, '', '&');
?>
href="index.php?<?php echo $queryString; ?>">
This is much easier than trying to edit and fix the $_SERVER['QUERY_STRING'] yourself.

Categories