using PHP simple html dom get attributes name in span? - html

I am not if 'tags' are the right term but i have to get the "data-time" values from this span into an array. How can I use simple html dom to get them?
Here is on span I am trying to get the "data-time" out of.
include('../simpleHtmlDom/simple_html_dom.php');
// Put the Twitters username here
$user = "yadayada";
$html = file_get_html("https://twitter.com/$user");
$ret = $html->find('div[class=ProfileTweet-contents]');
$ret = $html->find('p[class=ProfileTweet-text js-tweet-text u-dir]');
/// tries to get the time code but does only gets the span
$date = $html->find('span[class=js-short-timestamp js-relative-timestamp]', 0);
$DoesNotWork = $html->find( "data-time", 0 );
echo $ret[1]; // get's a users tweet.
echo $DoesNotWork;
The result of the date
<span class="js-short-timestamp js-relative-timestamp"
data-time="1401528672"
data-long-form="true">
15h
</span>
I would think it is something like this but this code does not work.
$html->find( "data-time", 0 );

You may try this:
// Include the script
$url = 'https://twitter.com/yourusername';
$html = file_get_html($url);
$dateTimes = array();
foreach ($html->find('div.GridTimeline .js-short-timestamp') as $value) {
$dateTimes[] = $value->innertext;
}
Result of print_r($dateTimes);:
Array
(
[0] => 2h
[1] => 2h
[2] => 2h
// Truncated...
[10] => 11h
[11] => May 30
[12] => May 30
[13] => May 6
// Truncated...
)

I was able to get the date using this code, tho I think there is a better way. I think it would be best to find a simple dom code that gets the text of the date-time in line
<span class"js-short-timestamp js-relative-timestamp" date-time="89393748474">
but instead I used two "list" php lines as seen below and that worked.
$dateTimes = array();
foreach ($html->find('div.GridTimeline .js-short-timestamp') as $value) {
$dateTimes[] = $value->outertext;
}
// These are the lines I get the date-time from.
list($Gone,$Keep) = explode("data-time=\"", $dateTimes[0]);
list($Date,$Gone) = explode("\"", $Keep);
$Date = date('M d, Y', $Date);

You want to use:
$html->find( "[data-time]", 0 );

In case anyone landing here in 2021, following no 1 google search result:
Unless I misinterpreted your intention, you might achieve what you want using (with simplehtmldom):
$html->find('span[data-time]')->attr[data-time];
The official simplehtmldom documentation fails to mention that. However, https://stackoverflow.com/a/14456823/10050838 is one possible source.

Related

Compare a current user against a list of employees logged into computers Perl, CGI

Not sure I am doing this correctly as it doesn't appear to be working.
Is this the correct way to declare my users, and is the If statement correctly formated?
At the top I have declared:
my $las = 'jpietrza hpietrza oszones';
These are employees we are checking against current users.
Further down in the code, I want to change the text color that is printed if the user is in the list vs. someone else.
while ( $sth->fetch() ) {
next unless defined $currentuser;
$lastlogin =~ s/ .*$//;
$host_name =~ s/1408//;
foreach ( #las ) {
if ( $currentuser eq "$_" ) {
$lacolor = "black";
last;
}
else {
$lacolor = "red";
}
}
print "<tr>";
print "<td>$host_name</td>";
print "<td><font color=\"$lacolor\">System In-Use (User Undisclosed)</font></td><td> </td>";
}
maybe there was nothing wrong with the if statement, but the whole 9 lines of code can be condensed to 1 very readable line:
$lacolor = any { /^$currentuser$/ } #las ? "black" : "red";
please
use List::Util qw/any/;
while($sth->fetch()) {
# $currentuser is assigned between the 'while' and this 'next' statement ?
# if not, then outside the loop and do not loop at all unless defined
next unless defined $currentuser;
$lastlogin=~s/ .*$//;
$host_name=~s/1408//;
$lacolor = any { /^$currentuser$/ } #las ? "black" : "red";
print "<tr>";
print "<td>$host_name</td>";
print "<td><font color=\"$lacolor\">System In-Use (User Undisclosed)</font></td><td> </td>";
}
please, also use strict; and use warnings;
I figured out how to put the array together correctly:
my #las = qw(
jpietrza
hpietrza
oszones
);
instead of:
my $las='
jpietrza
hpietrza
oszones
';
Firstly, as I think you have worked out now, the scalar variable $las and the array #las are completely different. As you've seen, you should declare and initialise your array like this:
my #las = qw(
jpietrza
hpietrza
oszones
);
Actually, I suspect this all gets easier if you store this in a hash, not an array;
my %las = map { $_ => 1 } qw(jpietrza hpietrza oszones);
Then your check just becomes:
my $lacolour = $las{$currentuser} ? 'black' : 'red';
A few more points:
Please add use strict and use warnings. And understand and fix the problems they reveal.
The quotes are unnecessary in if ($currentuser eq "$_").
Using a templating system to create the output will make your life a lot easier.
Update: Oh, and one I forgot earlier. It's 2017. No-one has used the font element in HTML for fifteen years. Take a look at CSS.

$index as a parameter : multiple if statement issue

Please take a look at this function :
function my_func($index_bis) {
if (!is_int($index_bis) || $index_bis > 5 || $index_bis < 0) return;
elseif ($index_bis = 5) : echo 'This';
elseif ($index_bis = 1) : echo 'That';
endif;
}
What's wrong with this? I actually can't understand where is the mistake...
Thank you for your help.
What is this? PHP?
And what are you attempting to do?
How about this:
function my_func($index_bis) {
if (!is_int($index_bis) || $index_bis > 5 || $index_bis < 0){
$str = $index_bis;
}
elseif ($index_bis == 5) {
$str='This';
}
elseif ($index_bis == 1) {
$str='That';
}
return $str;
}
It's pretty atypical to put anything after "return"; and I think "return" stops the function, effectively.
Edit: FOREACH method.
If you are building html from two related variables, FOREACH is a great method for handling them, as you can set a data "key" and "value" for each item in the array.
By default, the "key" in PHP is assigned a number, starting from 0 and progressing through increasing integers. You have the option of naming these keys, instead of using the PHP-assigned default.
So consider setting up your array as such:
$newArray = (
'tab name' => 'label name',
'apples' => 'red',
'oranges' => 'orange',
);
Wherein the item to the left of the "=>" is always the key, and the item to the right is always the value.
Then, you can add more elements to this array in your code by using this line:
$newArray['bananas'] = 'yellow';
Note the key (tab) name, with square brackets (because it is the key name) and single quotes (because it is a string).
Now that you have an array, you can "walk" it using a FOREACH loop and echoing the html. Here is the code:
foreach($newArray as $key => $value) {
echo "<tab>$key</tab> : ";
echo "<label>$value</label>
echo "<br /";
}
This will output the html below:
<tab>tab name</tab> : <label>label name</label><br />
<tab>apples</tab> : <label>red</label><br />
<tab>oranges</tab> : <label>orange</label><br />
<tab>bananas</tab> : <label>yellow</label><br />
Very useful. Have fun!
Note: There are likely better ways to do this, but I'm sharing this one as a simple solution. And also, because you shouldn't go further without understanding both FOREACH and simple arrays.
Note: If you want to incorporate more than two variables, you will need a more complex data structure. In PHP, these are called "multidimensional arrays". Give it a read. Beyond that, there are still more methods for handling data (ie. "objects").

echo a variable from a multidimentional array outside a function

The code below works for a string value but not when I try to access the variable directly.
The data being accessed is a table at http://webrates.truefx.com/rates/connect.html?f=html
My code strips it of tags and put it in an array $row0
And puts it in a function. But I can't get it out. The function is simplified for this question. I intend to concatenate some of the variables inside the function once I find out what I'm doing wrong.
$row0 = array();
include "scrape/simple_html_dom.php";
$url = "http://webrates.truefx.com/rates/connect.html?f=html";
$html = new simple_html_dom();
$html->load_file($url);
foreach ($html->find('tr') as $i => $row) {
foreach ($row->find('td') as $j => $col) {
$row0[$i][$j]= strip_tags($col);
}
}
myArray($row0); //table stripped of tags
function myArray($arr) {
$a = 'hello'; //$arr[0][0]; HELLO will come out but not the variable
$b = $arr[1][0];
$r[0] = $a;
$r[1] = $b;
//echo $r[1]; If the //'s are removed one can see the proper value here but not outside the function.
return $r;
}
$arrayToEcho = myArray($arr);
echo $arrayToEcho[0]; // will echo "first"
I have tried all the suggestions from here:
http://stackoverflow.com/questions/3451906/multiple-returns-from-function
http://stackoverflow.com/questions/5692568/php-function-return-array
Suggestion appreciated please and more info available if required. Thank you very much for viewing.
You need to get the innertext of $col in your loop. Like this:
$row0[$i][$j]= $col->innertext;
The next thing is:
myArray($row0);
This call will correctly return the parsed array; try echoing it and you'll see. But when you do this:
$arrayToEcho = myArray($arr);
...you're referencing to $arr which is a local variable (a parameter, actually) inside your function myArr. So what you probably meant was this:
$arrayToEcho = myArray($row0);
Hope this helps!
UPDATE
Look, I show you what happens when you call a function:

how use mysql_data_seek with PDO?

I want use mysql_data_seek with PDO from google search I found that it should looks like this:
$row0 = $result->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, 0);
however it's not work, what I do wrong?
this is my code:
$query = "SELECT name,age FROM users";
$q = $db->prepare($query);
$q->execute();
$q->setFetchMode(PDO::FETCH_ASSOC);
$arrayData = $q->fetchAll();
foreach ($arrayData as $row){
echo $row['name'] ." ";
echo $row['age'] ."<br>";
}
$result = $q->fetch(PDO::FETCH_OBJ,PDO::FETCH_ORI_ABS,4);
var_dump($result);
I just want get the 5th row in object form from the last run query. I don't want run this query again (as some guys told me) I just want the results from sql buffer.
the var_dump result is: bool(false)
any ideas?
EDIT:
thanks for your answers and sorry but maybe I don't explain myself as well. I like the trick with JSON but the point is that the 5th row is example. I just want use the result of the query from the buffer with PDO exactly as I did it with mysql_data_seek in regular mysql (change the cursor). is it possible? I like all the tricks but that not what I look for.
the PDO 'cursor' default is PDO::CURSOR_FWDONLY that means that cursor can't back to zero like it happens with mysql_data_seek to allow cursor back to zero it necessary define use 'scrollable cursor'
example:
$db->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
before use it like this:
$row0 = $result->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, 0);
$result = $arrayData[4];
is all you need.
If you want the 5th row result you can do like this:
$result = json_decode(json_encode($arrayData[4]), FALSE);
var_dump($result);
or something like this:
$object = new stdClass();
foreach ($array as $key => $value)
{
$object->$key = $value;
}
Just curious! why do you need the object form?
EDIT (this will give the object form of the 5th row):
$index = 0;
$fifthRow = new stdClass();
while($row = $q->fetch())
{
if($index++==4)
$fifthRow = json_decode(json_encode($row), FALSE);
}
You could do it like this:
$c = 1;
$saved=null;
while($row = $q->fetch()){
if($c==4){
$saved = clone $row;
};
$c++;
somethingelse;
}
$saved will then contain the 4th element as an object with almost no extra overhead calculations.

Multidimensional Array insert into Mysql rows

I have an Array (twodimensional) and i insert it into my database.
My Code:
$yourArr = $_POST;
$action = $yourArr['action'];
$mysql = $yourArr['mysql'];
$total = $yourArr['total'];
unset( $yourArr['action'] , $yourArr['mysql'] , $yourArr['total'] );
foreach ($yourArr as $k => $v) {
list($type,$num) = explode('_item_',$k);
$items[$num][$type] = $v;
$pnr= $items[$num][pnr];
$pkt= $items[$num][pkt];
$desc= $items[$num][desc];
$qty= $items[$num][qty];
$price= $items[$num][price];
$eintragen = mysql_query("INSERT INTO rechnungspositionen (artikelnummer, menge, artikel, beschreibung,preis) VALUES ('$pnr', '$qty', '$pkt', '$desc', '$price')");
}
I get 5 inserts in the Database but only the 5th have the informations i want. The firsts are incomplete.
Can someone help me?
Sorry for my english.
check if You have sent vars from browser in array (like
input name="some_name[]" ...
also You can check, what You get at any time by putting var_dump($your_var) in any place in script.
good luck:)
You probably want to have your query and the 5 assignments above that outside of the foreach. Instead in a new loop which only executes once for every item instead of 5 times. Your indentation even suggests the same however your brackets do not.
Currently it is only assigning one value each time and executing a new query. After 5 times all the variables are assigned and the last inserted row finally has everything proper.
error_reporting(E_ALL);
$items = array();
foreach($yourArr as $k => $v) {
// check here if the variable is one you need
list($type, $num) = explode('_item_', $k);
$items[$num][$type] = $v;
}
foreach($items as $item) {
$pnr = mysql_real_escape_string($item['pnr']);
$pkt = mysql_real_escape_string($item['pkt']);
$desc = mysql_real_escape_string($item['desc']);
$qty = mysql_real_escape_string($item['qty']);
$price = mysql_real_escape_string($item['price']);
$eintragen = mysql_query("INSERT INTO rechnungspositionen (artikelnummer, menge, artikel, beschreibung,preis) VALUES ('$pnr', '$qty', '$pkt', '$desc', '$price')");
}
Switching on your error level to E_ALL would have hinted in such a direction, among else:
unquoted array-keys: if a constant of
the same name exists your script will
be unpredictable.
unescaped variables: malformed values
or even just containing a quote which
needs to be there will fail your
query or worse.
naïve exploding: not each $_POST-key
variable will contain the string
item and your list will fail, including subsequent use of $num